[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size = 4\ntrim_trailing_whitespace = true\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[*.{yml,yaml}]\nindent_size = 2\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Path-based git attributes\n# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html\n\n# Ignore all test and documentation with \"export-ignore\".\n/.env.example       export-ignore\n/.gitattributes     export-ignore\n/.gitignore         export-ignore\n/.github            export-ignore\n/phpunit.xml.dist   export-ignore\n/.scrutinizer.yml   export-ignore\n/tests              export-ignore\n/.editorconfig      export-ignore\nphpstan.neon.dist   export-ignore\n"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "content": "# Code of Conduct\n\nThe Laravel Code of Conduct can be found in the [Laravel documentation](https://laravel.com/docs/contributions#code-of-conduct).\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contribution Guide\n\nThe Laravel contributing guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--\nPlease only send a pull request to branches which are currently supported: https://laravel.com/docs/releases#support-policy \n\nIf you are unsure which branch your pull request should be sent to, please read: https://laravel.com/docs/contributions#which-branch\n\nPull requests without a descriptive title, thorough description, or tests will be closed.\n\nIn addition, please describe the benefit to end users; the reasons it does not break any existing features; how it makes building web applications easier, etc.\n-->\n"
  },
  {
    "path": ".github/SECURITY.md",
    "content": "# Security Policy\n\n**PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, [SEE BELOW](#reporting-a-vulnerability).**\n\n## Supported Versions\n\nOnly the latest major version receives security fixes.\n\n## Reporting a Vulnerability\n\nIf you discover a security vulnerability within Laravel, please send an email to Taylor Otwell at taylor@laravel.com. All security vulnerabilities will be promptly addressed.\n\n### Public PGP Key\n\n```\n-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: OpenPGP v2.0.8\nComment: Report Security Vulnerabilities to taylor@laravel.com\n\n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\nWBGOG/qJGDlNiqBYYt2xNqzHCJoC\n=zXOv\n-----END PGP PUBLIC KEY BLOCK-----\n```\n"
  },
  {
    "path": ".github/SUPPORT.md",
    "content": "# Support Questions\n\nThe Laravel support guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions#support-questions).\n"
  },
  {
    "path": ".github/workflows/static-analysis.yml",
    "content": "name: static analysis\n\non:\n  push:\n    branches:\n      - master\n      - '*.x'\n  pull_request:\n\npermissions:\n  contents: read\n\njobs:\n  tests:\n    uses: laravel/.github/.github/workflows/static-analysis.yml@main\n"
  },
  {
    "path": ".github/workflows/tests.yml",
    "content": "name: tests\n\non:\n  push:\n  pull_request:\n  schedule:\n    - cron: '0 0 * * *'\n\njobs:\n  tests:\n    runs-on: ubuntu-22.04\n\n    strategy:\n      fail-fast: true\n      matrix:\n        php: [8.1, 8.2, 8.3]\n        laravel: [10, 11, '12', '13']\n        exclude:\n          - php: 8.1\n            laravel: 11\n          - laravel: '12'\n            php: 8.1\n          - laravel: '13'\n            php: 8.1\n          - laravel: '13'\n            php: 8.2\n\n    name: PHP ${{ matrix.php }} - Laravel ${{ matrix.laravel }}\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n\n      - name: Setup PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: ${{ matrix.php }}\n          tools: composer:v2\n          coverage: none\n\n      - name: Setup Problem Matches\n        run: |\n          echo \"::add-matcher::${{ runner.tool_cache }}/php.json\"\n          echo \"::add-matcher::${{ runner.tool_cache }}/phpunit.json\"\n\n      - name: Install PHP dependencies\n        run: |\n          composer require \"illuminate/contracts=^${{ matrix.laravel }}\" --no-update\n          composer update --prefer-dist --no-interaction --no-progress\n\n      - name: Install Octane\n        run: |\n          composer require laravel/octane --with-all-dependencies --dev\n        if: |\n          matrix.php >= 8.0 && (matrix.laravel == '8' || matrix.laravel == '9' || matrix.laravel == '10' || matrix.laravel == '11')\n\n      - name: Execute unit tests\n        run: vendor/bin/phpunit\n"
  },
  {
    "path": ".github/workflows/update-changelog.yml",
    "content": "name: update changelog\n\non:\n  release:\n    types: [released]\n\njobs:\n  update:\n    permissions:\n      contents: write\n    uses: laravel/.github/.github/workflows/update-changelog.yml@main\n"
  },
  {
    "path": ".gitignore",
    "content": ".env\n.phpunit.result.cache\nphpunit.xml\nbuild\ncomposer.lock\ndocs\nvendor\ncoverage\n"
  },
  {
    "path": ".styleci.yml",
    "content": "preset: laravel\n\ndisabled:\n  - single_class_element_per_statement\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Release Notes\n\n## [Unreleased](https://github.com/laravel/vapor-core/compare/v2.43.3...2.0)\n\n## [v2.43.3](https://github.com/laravel/vapor-core/compare/v2.43.2...v2.43.3) - 2026-03-09\n\n* [2.0] Catch PDOException when MySQL server has gone away during SET SESSION wait_timeout reset by [@rizalpahlevii](https://github.com/rizalpahlevii) in https://github.com/laravel/vapor-core/pull/200\n\n## [v2.43.2](https://github.com/laravel/vapor-core/compare/v2.43.1...v2.43.2) - 2026-02-21\n\n* Laravel 13.x Compatibility by [@laravel-shift](https://github.com/laravel-shift) in https://github.com/laravel/vapor-core/pull/199\n\n## [v2.43.1](https://github.com/laravel/vapor-core/compare/v2.43.0...v2.43.1) - 2026-01-20\n\n* fix: `curl_close()` is deprecated by [@mortenhauberg](https://github.com/mortenhauberg) in https://github.com/laravel/vapor-core/pull/198\n\n## [v2.43.0](https://github.com/laravel/vapor-core/compare/v2.42.0...v2.43.0) - 2026-01-08\n\n* Add dynamic cli handler factory. by [@Sfonxs](https://github.com/Sfonxs) in https://github.com/laravel/vapor-core/pull/197\n\n## [v2.42.0](https://github.com/laravel/vapor-core/compare/v2.41.0...v2.42.0) - 2025-12-19\n\n* Expose AWS Lambda execution context for Vapor logging by [@sahil7194](https://github.com/sahil7194) in https://github.com/laravel/vapor-core/pull/196\n\n## [v2.41.0](https://github.com/laravel/vapor-core/compare/v2.40.0...v2.41.0) - 2025-09-10\n\n* fix: Allow custom Lambda events from SQS by [@mathiasgrimm](https://github.com/mathiasgrimm) in https://github.com/laravel/vapor-core/pull/194\n\n## [v2.40.0](https://github.com/laravel/vapor-core/compare/v2.39.0...v2.40.0) - 2025-08-04\n\n## [v2.39.0](https://github.com/laravel/vapor-core/compare/v2.38.2...v2.39.0) - 2025-07-10\n\n* Add API Gateway request timestamp to server variables by [@mortenhauberg](https://github.com/mortenhauberg) in https://github.com/laravel/vapor-core/pull/192\n\n## [v2.38.2](https://github.com/laravel/vapor-core/compare/v2.38.1...v2.38.2) - 2025-07-04\n\n## [v2.38.1](https://github.com/laravel/vapor-core/compare/v2.38.0...v2.38.1) - 2025-06-27\n\n## [v2.38.0](https://github.com/laravel/vapor-core/compare/v2.37.9...v2.38.0) - 2025-06-02\n\n* Fix missing write permission for changelog updater by [@olivernybroe](https://github.com/olivernybroe) in https://github.com/laravel/vapor-core/pull/189\n* [2.x] Fixes support for S3-Compatible Storage like Herd minio by [@pintend](https://github.com/pintend) in https://github.com/laravel/vapor-core/pull/190\n\n## [v2.37.9](https://github.com/laravel/vapor-core/compare/v2.37.8...v2.37.9) - 2025-01-07\n\n* Fix parsing multidimensional array from multipart by [@Vinimaks](https://github.com/Vinimaks) in https://github.com/laravel/vapor-core/pull/186\n\n## [v2.37.8](https://github.com/laravel/vapor-core/compare/v2.37.2...v2.37.8) - 2024-12-06\n\n* Fix Octane cookies for v2 by [@Vinimaks](https://github.com/Vinimaks) in https://github.com/laravel/vapor-core/pull/185\n\n## [v2.37.2](https://github.com/laravel/vapor-core/compare/v2.37.1...v2.37.2) - 2024-11-06\n\n* Add missing files in .github by [@Jubeki](https://github.com/Jubeki) in https://github.com/laravel/vapor-core/pull/178\n* [2.x] Reset scoped instances before running a new vapor job by [@themsaid](https://github.com/themsaid) in https://github.com/laravel/vapor-core/pull/183\n* Fix tests by [@themsaid](https://github.com/themsaid) in https://github.com/laravel/vapor-core/pull/184\n\n## [v2.37.1](https://github.com/laravel/vapor-core/compare/v2.33.2...v2.37.1) - 2024-03-26\n\n* Use VAPOR_ENV for non-standard environment option by [@joelvh](https://github.com/joelvh) in https://github.com/laravel/vapor-core/pull/176\n\n## [v2.33.2](https://github.com/laravel/cashier/compare/v2.33.1...v2.33.2) - 2023-10-03\n\n* [2.x] Adds helpers to determine when an app is running on Vapor  by @joedixon in https://github.com/laravel/vapor-core/pull/164\n"
  },
  {
    "path": "LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) Taylor Otwell <taylor@laravel.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\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\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Laravel Vapor Core / Runtime\n\n<p>\n<a href=\"https://github.com/laravel/vapor-core/actions\"><img src=\"https://github.com/laravel/vapor-core/workflows/tests/badge.svg\" alt=\"Build Status\"></a>\n<a href=\"https://packagist.org/packages/laravel/vapor-core\"><img src=\"https://img.shields.io/packagist/dt/laravel/vapor-core\" alt=\"Total Downloads\"></a>\n<a href=\"https://packagist.org/packages/laravel/vapor-core\"><img src=\"https://img.shields.io/packagist/v/laravel/vapor-core\" alt=\"Latest Stable Version\"></a>\n<a href=\"https://packagist.org/packages/laravel/vapor-core\"><img src=\"https://img.shields.io/packagist/l/laravel/vapor-core\" alt=\"License\"></a>\n</p>\n\n[Laravel Vapor](https://vapor.laravel.com) is an auto-scaling, serverless deployment platform for Laravel, powered by AWS Lambda. Manage your Laravel infrastructure on Vapor and fall in love with the scalability and simplicity of serverless.\n\nVapor abstracts the complexity of managing Laravel applications on AWS Lambda, as well as interfacing those applications with SQS queues, databases, Redis clusters, networks, CloudFront CDN, and more.\n\nThis repository contains the core service providers and runtime client used to make Laravel applications run smoothly in a serverless environment. To learn more about Vapor and how to use this repository, please consult the [official documentation](https://docs.vapor.build).\n"
  },
  {
    "path": "composer.json",
    "content": "{\n    \"name\": \"laravel/vapor-core\",\n    \"description\": \"The kernel and invocation handlers for Laravel Vapor\",\n    \"keywords\": [\n        \"laravel\",\n        \"vapor\"\n    ],\n    \"homepage\": \"https://github.com/laravel/vapor-core\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Taylor Otwell\",\n            \"email\": \"taylor@laravel.com\"\n        }\n    ],\n    \"require\": {\n        \"php\": \"^7.2|^8.0\",\n        \"aws/aws-sdk-php\": \"^3.80\",\n        \"guzzlehttp/promises\": \"^1.4|^2.0\",\n        \"guzzlehttp/guzzle\": \"^6.3|^7.0\",\n        \"hollodotme/fast-cgi-client\": \"^3.0\",\n        \"illuminate/container\": \"^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0\",\n        \"illuminate/http\": \"^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0\",\n        \"illuminate/queue\": \"^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0\",\n        \"illuminate/support\": \"^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0\",\n        \"monolog/monolog\": \"^1.12|^2.0|^3.2\",\n        \"nyholm/psr7\": \"^1.0\",\n        \"riverline/multipart-parser\": \"^2.0.9\",\n        \"symfony/process\": \"^4.3|^5.0|^6.0|^7.0\",\n        \"symfony/psr-http-message-bridge\": \"^1.0|^2.0|^6.4|^7.0\"\n    },\n    \"require-dev\": {\n        \"laravel/octane\": \"*\",\n        \"mockery/mockery\": \"^1.2\",\n        \"orchestra/testbench\": \"^4.0|^5.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0\",\n        \"phpstan/phpstan\": \"^1.10|^2.1\",\n        \"phpunit/phpunit\": \"^8.0|^9.0|^10.4|^11.5.3|^12.5.12\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Laravel\\\\Vapor\\\\\": \"src\"\n        },\n        \"files\": [\n            \"src/debug.php\"\n        ]\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"Laravel\\\\Vapor\\\\Tests\\\\\": \"tests\"\n        }\n    },\n    \"scripts\": {\n        \"test\": \"vendor/bin/phpunit\"\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"2.0-dev\"\n        },\n        \"laravel\": {\n            \"providers\": [\n                \"Laravel\\\\Vapor\\\\VaporServiceProvider\"\n            ],\n            \"aliases\": {\n                \"Vapor\": \"Laravel\\\\Vapor\\\\Vapor\"\n            }\n        }\n    },\n    \"config\": {\n        \"sort-packages\": true\n    },\n    \"minimum-stability\": \"dev\",\n    \"prefer-stable\": true\n}\n"
  },
  {
    "path": "config/vapor.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Redirect \"www\" To The Root Domain\n    |--------------------------------------------------------------------------\n    |\n    | When this option is enabled, Vapor will redirect requests to the \"www\"\n    | subdomain to the application's root domain. When this option is not\n    | enabled, Vapor redirects your root domain to the \"www\" subdomain.\n    |\n    */\n\n    'redirect_to_root' => true,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Redirect robots.txt\n    |--------------------------------------------------------------------------\n    |\n    | When this option is enabled, Vapor will redirect requests for your\n    | application's \"robots.txt\" file to the location of the S3 asset\n    | bucket or CloudFront's asset URL instead of serving directly.\n    |\n    */\n\n    'redirect_robots_txt' => true,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Servable Assets\n    |--------------------------------------------------------------------------\n    |\n    | Here you can configure list of public assets that should be servable\n    | from your application's domain instead of only being servable via\n    | the public S3 \"asset\" bucket or the AWS CloudFront CDN network.\n    |\n    */\n\n    'serve_assets' => [\n        //\n    ],\n\n];\n"
  },
  {
    "path": "phpstan.neon.dist",
    "content": "parameters:\n  paths:\n    - config\n    - src\n\n  level: 0\n\n  ignoreErrors:\n    - \"#Unsafe usage of new static\\\\(\\\\)#\"\n    - \"#\\\\(void\\\\) is used.#\"\n"
  },
  {
    "path": "phpunit.xml.dist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit bootstrap=\"vendor/autoload.php\"\n         backupGlobals=\"false\"\n         backupStaticAttributes=\"false\"\n         colors=\"true\"\n         verbose=\"true\"\n         convertErrorsToExceptions=\"true\"\n         convertNoticesToExceptions=\"true\"\n         convertWarningsToExceptions=\"true\"\n         convertDeprecationsToExceptions=\"true\"\n         processIsolation=\"false\"\n         stopOnFailure=\"false\"\n>\n    <testsuites>\n        <testsuite name=\"Unit\">\n            <directory suffix=\"Test.php\">./tests/Unit</directory>\n        </testsuite>\n        <testsuite name=\"Feature\">\n            <directory suffix=\"Test.php\">./tests/Feature</directory>\n        </testsuite>\n    </testsuites>\n    <php>\n        <env name=\"APP_VANITY_URL\" value=\"foo.vapor.build\"/>\n        <env name=\"APP_KEY\" value=\"AckfSECXIvnK5r28GVIWUAxmbBSjTsmF\"/>\n    </php>\n</phpunit>\n"
  },
  {
    "path": "src/Arr.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor;\n\n/*\nThe MIT License (MIT)\n\nCopyright (c) 2018 Matthieu Napoli\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\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\nTHE SOFTWARE.\n/*\n\n/**\n * @author Taylor Otwell <taylor@laravel.com>\n * @author Matthieu Napoli <matthieu@mnapoli.fr>\n */\nclass Arr\n{\n    /**\n     * Set a multi-part body array value in the given array.\n     *\n     * @param  array  $array\n     * @param  string  $name\n     * @param  mixed  $value\n     * @return array\n     */\n    public static function setMultipartArrayValue(array $array, string $name, $value)\n    {\n        $segments = explode('[', $name);\n\n        $pointer = &$array;\n\n        foreach ($segments as $key => $segment) {\n            // If this is our first time through the loop we will just grab the initial\n            // key's part of the array. After this we will start digging deeper into\n            // the array as needed until we get to the correct depth in the array.\n            if ($key === 0) {\n                $pointer = &$pointer[$segment];\n\n                continue;\n            }\n\n            // If this segment is malformed, we will just use the key as-is since there\n            // is nothing we can do with it from here. We will return the array back\n            // to the caller with the value set. We cannot continue looping on it.\n            if (static::malformedMultipartSegment($segment)) {\n                $array[$name] = $value;\n\n                return $array;\n            }\n\n            $segment = substr($segment, 0, -1);\n\n            // If the segment is empty after trimming off the closing bracket, it means\n            // we are at the end of the segment and are ready to set the value so we\n            // can grab a pointer to the array location and set it after the loop.\n            if ($segment === '') {\n                $pointer = &$pointer[];\n            } else {\n                $pointer = &$pointer[$segment];\n            }\n        }\n\n        $pointer = $value;\n\n        return $array;\n    }\n\n    /**\n     * Determine if the given multi-part value segment is malformed.\n     *\n     * This can occur when there are two [[ or no closing bracket.\n     *\n     * @param  string  $segment\n     * @return bool\n     */\n    protected static function malformedMultipartSegment($segment)\n    {\n        return $segment === '' || substr($segment, -1) !== ']';\n    }\n}\n"
  },
  {
    "path": "src/ConfiguresAssets.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor;\n\nuse Illuminate\\Support\\Facades\\Config;\n\ntrait ConfiguresAssets\n{\n    /**\n     * Ensure the asset path is properly configured.\n     *\n     * @return void\n     */\n    protected function ensureAssetPathsAreConfigured()\n    {\n        // Ensure we are running on Vapor...\n        if (! isset($_ENV['VAPOR_SSM_PATH'])) {\n            return;\n        }\n\n        if (! Config::get('app.asset_url')) {\n            Config::set('app.asset_url', $_ENV['ASSET_URL'] ?? '/');\n        }\n\n        if (! Config::get('app.mix_url')) {\n            Config::set('app.mix_url', $_ENV['MIX_URL'] ?? '/');\n        }\n    }\n}\n"
  },
  {
    "path": "src/ConfiguresDynamoDb.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor;\n\nuse Illuminate\\Support\\Facades\\Config;\n\ntrait ConfiguresDynamoDb\n{\n    /**\n     * Ensure DynamoDb is properly configured.\n     *\n     * @return void\n     */\n    protected function ensureDynamoDbIsConfigured()\n    {\n        // Ensure we are running on Vapor...\n        if (! isset($_ENV['VAPOR_SSM_PATH'])) {\n            return;\n        }\n\n        Config::set('cache.stores.dynamodb', array_merge([\n            'driver' => 'dynamodb',\n            'key' => $_ENV['AWS_ACCESS_KEY_ID'] ?? null,\n            'secret' => $_ENV['AWS_SECRET_ACCESS_KEY'] ?? null,\n            'region' => $_ENV['AWS_DEFAULT_REGION'] ?? 'us-east-1',\n            'table' => $_ENV['DYNAMODB_CACHE_TABLE'] ?? 'cache',\n            'endpoint' => $_ENV['DYNAMODB_ENDPOINT'] ?? null,\n        ], Config::get('cache.stores.dynamodb') ?? []));\n    }\n}\n"
  },
  {
    "path": "src/ConfiguresQueue.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor;\n\nuse Illuminate\\Cache\\NullStore;\nuse Illuminate\\Cache\\Repository;\nuse Illuminate\\Contracts\\Debug\\ExceptionHandler;\nuse Laravel\\Vapor\\Queue\\JobAttempts;\nuse Laravel\\Vapor\\Queue\\VaporWorker;\n\ntrait ConfiguresQueue\n{\n    /**\n     * Ensure the queue / workers are configured.\n     *\n     * @return void\n     */\n    protected function ensureQueueIsConfigured()\n    {\n        if ($this->app->bound('queue.vaporWorker')) {\n            return;\n        }\n\n        $this->app->singleton('queue.vaporWorker', function () {\n            $isDownForMaintenance = function () {\n                return $this->app->isDownForMaintenance();\n            };\n\n            return new VaporWorker(\n                $this->app['queue'],\n                $this->app['events'],\n                $this->app[ExceptionHandler::class],\n                $isDownForMaintenance\n            );\n        });\n\n        $this->app->singleton(JobAttempts::class, function () {\n            return new JobAttempts(\n                isset($_ENV['VAPOR_CACHE_JOB_ATTEMPTS']) && $_ENV['VAPOR_CACHE_JOB_ATTEMPTS'] === 'true'\n                    ? $this->app['cache']->driver()\n                    : new Repository(new NullStore())\n            );\n        });\n    }\n}\n"
  },
  {
    "path": "src/ConfiguresRedis.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor;\n\nuse Illuminate\\Support\\Arr;\nuse Illuminate\\Support\\Facades\\Config;\n\ntrait ConfiguresRedis\n{\n    /**\n     * Ensure Redis is properly configured.\n     *\n     * @return void\n     */\n    protected function ensureRedisIsConfigured()\n    {\n        if (! isset($_ENV['VAPOR_CACHE']) || $_ENV['VAPOR_CACHE'] !== 'true') {\n            return;\n        }\n\n        Config::set('database.redis', array_merge(Arr::except(Config::get('database.redis', []), ['default', 'cache']), [\n            'client' => $_ENV['REDIS_CLIENT'] ?? 'phpredis',\n            'options' => array_merge(\n                Config::get('database.redis.options', []),\n                array_filter([\n                    'cluster' => $_ENV['REDIS_CLUSTER'] ?? 'redis',\n                    'scheme' => $_ENV['REDIS_SCHEME'] ?? null,\n                    'context' => array_filter(['cafile' => $_ENV['REDIS_SSL_CA'] ?? null]),\n                ])\n            ),\n            'clusters' => array_merge(Config::get('database.redis.clusters', []), [\n                'default' => [\n                    [\n                        'host' => $_ENV['REDIS_HOST'] ?? '127.0.0.1',\n                        'password' => null,\n                        'port' => 6379,\n                        'database' => 0,\n                    ],\n                ],\n                'cache' => [\n                    [\n                        'host' => $_ENV['REDIS_HOST'] ?? '127.0.0.1',\n                        'password' => null,\n                        'port' => 6379,\n                        'database' => 0,\n                    ],\n                ],\n            ]),\n        ]));\n    }\n}\n"
  },
  {
    "path": "src/ConfiguresSqs.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor;\n\nuse Illuminate\\Support\\Facades\\Config;\n\ntrait ConfiguresSqs\n{\n    /**\n     * Ensure SQS is properly configured.\n     *\n     * @return void\n     */\n    protected function ensureSqsIsConfigured()\n    {\n        // Ensure we are running on Vapor...\n        if (! isset($_ENV['VAPOR_SSM_PATH'])) {\n            return;\n        }\n\n        Config::set('queue.connections.sqs', array_merge([\n            'driver' => 'sqs',\n            'key' => $_ENV['AWS_ACCESS_KEY_ID'] ?? null,\n            'secret' => $_ENV['AWS_SECRET_ACCESS_KEY'] ?? null,\n            'prefix' => $_ENV['SQS_PREFIX'] ?? null,\n            'queue' => $_ENV['SQS_QUEUE'] ?? 'default',\n            'region' => $_ENV['AWS_DEFAULT_REGION'] ?? 'us-east-1',\n        ], Config::get('queue.connections.sqs') ?? []));\n    }\n}\n"
  },
  {
    "path": "src/Console/Commands/OctaneStatusCommand.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Console\\Commands;\n\nuse Illuminate\\Console\\Command;\n\nclass OctaneStatusCommand extends Command\n{\n    /**\n     * The command's signature.\n     *\n     * @var string\n     */\n    public $signature = 'octane:status';\n\n    /**\n     * The command's description.\n     *\n     * @var string\n     */\n    public $description = 'Get the current status of the Octane server';\n\n    /**\n     * Handle the command.\n     *\n     * @return void\n     */\n    public function handle()\n    {\n        $this->isEnvironmentRunningOnOctane()\n            ? $this->info('Octane server is running.')\n            : $this->info('Octane server is not running.');\n    }\n\n    /**\n     * Determine if the environment is running on Octane.\n     *\n     * @return bool\n     */\n    protected function isEnvironmentRunningOnOctane()\n    {\n        return isset($_ENV['OCTANE_DATABASE_SESSION_TTL']);\n    }\n}\n"
  },
  {
    "path": "src/Console/Commands/VaporHealthCheckCommand.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Console\\Commands;\n\nuse Exception;\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Support\\Facades\\Cache;\nuse Illuminate\\Support\\Str;\n\nclass VaporHealthCheckCommand extends Command\n{\n    /**\n     * The console command name.\n     *\n     * @var string\n     */\n    protected $signature = 'vapor:health-check';\n\n    /**\n     * The console command description.\n     *\n     * @var string\n     */\n    protected $description = 'Check the health of the Vapor application';\n\n    /**\n     * Indicates whether the command should be shown in the Artisan command list.\n     *\n     * @var bool\n     */\n    protected $hidden = true;\n\n    /**\n     * Execute the console command.\n     *\n     * @return void\n     */\n    public function handle()\n    {\n        $this->ensureBaseConfigurationFilesWereHarmonized();\n\n        $this->ensureCacheIsWorking();\n\n        return $this->info('Health check complete!');\n    }\n\n    /**\n     * Ensure the configuration files were harmonized.\n     *\n     * @return void\n     */\n    protected function ensureBaseConfigurationFilesWereHarmonized()\n    {\n        if (! file_exists($filename = __DIR__.'/../../../../framework/config/cache.php')) {\n            return;\n        }\n\n        $configuration = file_get_contents($filename);\n\n        if (! Str::contains($configuration, \"'key' => env('NULL_AWS_ACCESS_KEY_ID')\")) {\n            throw new Exception(\n                'Laravel 11 or later requires the latest version of Vapor CLI.'\n            );\n        }\n    }\n\n    /**\n     * Ensure cache calls are working as expected.\n     *\n     * @return void\n     */\n    protected function ensureCacheIsWorking()\n    {\n        Cache::get('vapor-health-check');\n    }\n}\n"
  },
  {
    "path": "src/Console/Commands/VaporQueueListFailedCommand.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Console\\Commands;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Queue\\ManuallyFailedException;\nuse Illuminate\\Support\\Str;\n\nclass VaporQueueListFailedCommand extends Command\n{\n    /**\n     * The console command name.\n     *\n     * @var string\n     */\n    protected $signature = 'vapor:queue-failed\n                            {--limit= : The number of failed jobs to return}\n                            {--page=1 : The page of failed jobs to return}\n                            {--id= : The job ID filter by}\n                            {--queue= : The queue to filter by}\n                            {--query= : The search query to filter by}\n                            {--start= : The start timestamp to filter by}';\n\n    /**\n     * The console command description.\n     *\n     * @var string\n     */\n    protected $description = 'List all of the failed queue jobs';\n\n    /**\n     * Indicates whether the command should be shown in the Artisan command list.\n     *\n     * @var bool\n     */\n    protected $hidden = true;\n\n    /**\n     * Execute the console command.\n     *\n     * @return void\n     */\n    public function handle()\n    {\n        $options = collect($this->options())\n            ->filter(function ($value, $option) {\n                return ! is_null($value) && in_array($option, ['id', 'queue', 'query', 'start']);\n            });\n\n        $failer = $this->laravel['queue.failer'];\n        $start = $this->option('start');\n\n        if (is_callable([$failer, 'getTable']) && $start) {\n            $failed = $failer->getTable()\n                ->where('failed_at', '>=', Carbon::createFromTimestamp($start)->toDateTimeString())\n                ->get();\n\n            $options = $options->reject(function ($value, $name) {\n                return $name === 'start';\n            });\n        } else {\n            $failed = $failer->all();\n        }\n\n        $failedJobs = collect($failed)->filter(function ($job) use ($options) {\n            return $options->every(function ($value, $option) use ($job) {\n                return $this->filter($job, $option, $value);\n            });\n        });\n\n        $total = count($failedJobs);\n\n        $page = $this->option('page');\n        $limit = $this->option('limit');\n\n        if ($limit) {\n            $failedJobs = $failedJobs->forPage($page, $limit);\n        }\n\n        $failedJobs = $failedJobs->map(function ($failed) {\n            return array_merge((array) $failed, [\n                'payload' => $failed->payload,\n                'exception' => Str::limit($failed->exception, 1000),\n                'name' => $this->extractJobName($failed->payload),\n                'queue' => Str::afterLast($failed->queue, '/'),\n                'message' => $this->extractMessage($failed->exception),\n                'connection' => $failed->connection,\n            ]);\n        })->values()->toArray();\n\n        $failedJobs = [\n            'failed_jobs' => $failedJobs,\n            'total' => $total,\n            'from' => $limit ? ($page - 1) * $limit + 1 : 1,\n            'to' => $limit ? min($page * $limit, $total) : $total,\n            'has_next_page' => $limit && $total > $limit * $page,\n            'has_previous_page' => $limit && $page > 1 && $total > $limit * ($page - 1),\n        ];\n\n        $this->output->writeln(\n            json_encode($failedJobs)\n        );\n    }\n\n    /**\n     * Extract the failed job name from payload.\n     *\n     * @param  string  $payload\n     * @return string|null\n     */\n    private function extractJobName($payload)\n    {\n        $payload = json_decode($payload, true);\n\n        if ($payload && (! isset($payload['data']['command']))) {\n            return $payload['job'] ?? null;\n        } elseif ($payload && isset($payload['data']['command'])) {\n            return $this->matchJobName($payload);\n        }\n    }\n\n    /**\n     * Extract the failed job message from exception.\n     *\n     * @param  string  $exception\n     * @return string\n     */\n    private function extractMessage($exception)\n    {\n        if (Str::startsWith($exception, ManuallyFailedException::class)) {\n            $message = 'Manually failed';\n        } else {\n            [$_, $message] = explode(':', $exception);\n            [$message] = explode(' in /', $message);\n            [$message] = explode(' in closure', $message);\n        }\n\n        if (! empty($message)) {\n            return trim($message);\n        }\n\n        return '';\n    }\n\n    /**\n     * Match the job name from the payload.\n     *\n     * @param  array  $payload\n     * @return string|null\n     */\n    protected function matchJobName($payload)\n    {\n        preg_match('/\"([^\"]+)\"/', $payload['data']['command'], $matches);\n\n        return $matches[1] ?? $payload['job'] ?? null;\n    }\n\n    /**\n     * Determine whether the given job matches the given filter.\n     *\n     * @param  stdClass  $job\n     * @param  string  $option\n     * @param  string  $value\n     * @return bool\n     */\n    protected function filter($job, $option, $value)\n    {\n        if ($option === 'id') {\n            return $job->id === $value;\n        }\n\n        if ($option === 'queue') {\n            return Str::afterLast($job->queue, '/') === $value;\n        }\n\n        if ($option === 'query') {\n            return Str::contains(json_encode($job), $value);\n        }\n\n        if ($option === 'start') {\n            return Carbon::parse($job->failed_at)->timestamp >= $value;\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "src/Console/Commands/VaporScheduleCommand.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Console\\Commands;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Cache\\Repository;\nuse Illuminate\\Support\\Str;\n\nclass VaporScheduleCommand extends Command\n{\n    /**\n     * The console command name.\n     *\n     * @var string\n     */\n    protected $signature = 'vapor:schedule';\n\n    /**\n     * The console command description.\n     *\n     * @var string\n     */\n    protected $description = 'Run the scheduled commands at the beginning of every minute';\n\n    /**\n     * Indicates whether the command should be shown in the Artisan command list.\n     *\n     * @var bool\n     */\n    protected $hidden = true;\n\n    /**\n     * Execute the console command.\n     */\n    public function handle(): int\n    {\n        if (! $cache = $this->ensureValidCacheDriver()) {\n            $this->call('schedule:run');\n\n            return 0;\n        }\n\n        $key = (string) Str::uuid();\n        $lockObtained = false;\n\n        while (true) {\n            if (! $lockObtained) {\n                $lockObtained = $this->obtainLock($cache, $key);\n            }\n\n            if ($lockObtained && now()->second === 0) {\n                $this->releaseLock($cache);\n\n                $this->call('schedule:run');\n\n                return 0;\n            }\n\n            if (! $lockObtained && now()->second === 0) {\n                return 1;\n            }\n\n            usleep(10000);\n        }\n    }\n\n    /**\n     * Ensure the cache driver is valid.\n     */\n    protected function ensureValidCacheDriver(): ?Repository\n    {\n        $manager = $this->laravel['cache'];\n\n        if (in_array($manager->getDefaultDriver(), ['memcached', 'redis', 'dynamodb', 'database'])) {\n            return $manager->driver();\n        }\n\n        return null;\n    }\n\n    /**\n     * Obtain the lock for the schedule.\n     */\n    protected function obtainLock(Repository $cache, string $key): bool\n    {\n        return $key === $cache->remember('vapor:schedule:lock', 60, function () use ($key) {\n            return $key;\n        });\n    }\n\n    /**\n     * Release the lock for the schedule.\n     */\n    protected function releaseLock(Repository $cache): void\n    {\n        $cache->forget('vapor:schedule:lock');\n    }\n}\n"
  },
  {
    "path": "src/Console/Commands/VaporWorkCommand.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Console\\Commands;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Queue\\Events\\JobFailed;\nuse Illuminate\\Queue\\WorkerOptions;\nuse Laravel\\Vapor\\Events\\LambdaEvent;\nuse Laravel\\Vapor\\Queue\\VaporJob;\nuse Laravel\\Vapor\\Queue\\VaporWorker;\n\nclass VaporWorkCommand extends Command\n{\n    use WritesQueueEventMessages;\n\n    /**\n     * The console command name.\n     *\n     * @var string\n     */\n    protected $signature = 'vapor:work\n                            {--delay=0 : The number of seconds to delay failed jobs}\n                            {--timeout=0 : The number of seconds a child process can run}\n                            {--tries=0 : Number of times to attempt a job before logging it failed}\n                            {--force : Force the worker to run even in maintenance mode}';\n\n    /**\n     * The console command description.\n     *\n     * @var string\n     */\n    protected $description = 'Process a Vapor job';\n\n    /**\n     * Indicates whether the command should be shown in the Artisan command list.\n     *\n     * @var bool\n     */\n    protected $hidden = true;\n\n    /**\n     * The queue worker instance.\n     *\n     * @var \\Laravel\\Vapor\\Queue\\VaporWorker\n     */\n    protected $worker;\n\n    /**\n     * Indicates if the worker is already listening for events.\n     *\n     * @var bool\n     */\n    protected static $listeningForEvents = false;\n\n    /**\n     * Create a new queue work command.\n     *\n     * @param  \\Laravel\\Vapor\\Queue\\VaporWorker  $worker\n     * @return void\n     */\n    public function __construct(VaporWorker $worker)\n    {\n        parent::__construct();\n\n        $this->worker = $worker;\n    }\n\n    /**\n     * Execute the console command.\n     *\n     * @param  \\Laravel\\Vapor\\Events\\LambdaEvent  $event\n     * @return void\n     */\n    public function handle(LambdaEvent $event)\n    {\n        if ($this->downForMaintenance()) {\n            return;\n        }\n\n        if (! static::$listeningForEvents) {\n            $this->listenForEvents();\n\n            static::$listeningForEvents = true;\n        }\n\n        $this->worker->setCache($this->laravel['cache']->driver());\n\n        return $this->worker->runVaporJob(\n            $this->marshalJob($this->message($event)),\n            'sqs',\n            $this->gatherWorkerOptions()\n        );\n    }\n\n    /**\n     * Marshal the job with the given message ID.\n     *\n     * @param  array  $message\n     * @return \\Laravel\\Vapor\\Queue\\VaporJob\n     */\n    protected function marshalJob(array $message)\n    {\n        $normalizedMessage = $this->normalizeMessage($message);\n\n        $queue = $this->worker->getManager()->connection('sqs');\n\n        return new VaporJob(\n            $this->laravel, $queue->getSqs(), $normalizedMessage,\n            'sqs', $this->queueUrl($message)\n        );\n    }\n\n    /**\n     * Normalize the casing of the message array.\n     *\n     * @param  array  $message\n     * @return array\n     */\n    protected function normalizeMessage(array $message)\n    {\n        return [\n            'MessageId' => $message['messageId'],\n            'ReceiptHandle' => $message['receiptHandle'],\n            'Body' => $message['body'],\n            'Attributes' => $message['attributes'],\n            'MessageAttributes' => $message['messageAttributes'],\n        ];\n    }\n\n    /**\n     * Get the message payload.\n     *\n     * @param  \\Laravel\\Vapor\\Events\\LambdaEvent  $event\n     * @return array\n     */\n    protected function message($event)\n    {\n        return $event['Records'][0];\n    }\n\n    /**\n     * Get the queue URL from the given message.\n     *\n     * @param  array  $message\n     * @return string\n     */\n    protected function queueUrl(array $message)\n    {\n        $eventSourceArn = explode(':', $message['eventSourceARN']);\n\n        return sprintf(\n            'https://sqs.%s.amazonaws.com/%s/%s',\n            $message['awsRegion'],\n            $accountId = $eventSourceArn[4],\n            $queue = $eventSourceArn[5]\n        );\n    }\n\n    /**\n     * Gather all of the queue worker options as a single object.\n     *\n     * @return \\Illuminate\\Queue\\WorkerOptions\n     */\n    protected function gatherWorkerOptions()\n    {\n        $options = [\n            $this->option('delay'),\n            $memory = 512,\n            $this->option('timeout'),\n            $sleep = 0,\n            $this->option('tries'),\n            $this->option('force'),\n            $stopWhenEmpty = false,\n        ];\n\n        if (property_exists(WorkerOptions::class, 'name')) {\n            $options = array_merge(['default'], $options);\n        }\n\n        return new WorkerOptions(...$options);\n    }\n\n    /**\n     * Store a failed job event.\n     *\n     * @param  \\Illuminate\\Queue\\Events\\JobFailed  $event\n     * @return void\n     */\n    protected function logFailedJob(JobFailed $event)\n    {\n        $this->laravel['queue.failer']->log(\n            $event->connectionName, $event->job->getQueue(),\n            $event->job->getRawBody(), $event->exception\n        );\n    }\n\n    /**\n     * Determine if the worker should run in maintenance mode.\n     *\n     * @return bool\n     */\n    protected function downForMaintenance()\n    {\n        if (! $this->option('force')) {\n            return $this->laravel->isDownForMaintenance();\n        }\n\n        return false;\n    }\n\n    /**\n     * Reset static variables.\n     *\n     * @return void\n     */\n    public static function flushState()\n    {\n        static::$listeningForEvents = false;\n    }\n}\n"
  },
  {
    "path": "src/Console/Commands/WritesQueueEventMessages.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Console\\Commands;\n\nuse Illuminate\\Contracts\\Queue\\Job;\nuse Illuminate\\Queue\\Events\\JobFailed;\nuse Illuminate\\Queue\\Events\\JobProcessed;\nuse Illuminate\\Queue\\Events\\JobProcessing;\n\ntrait WritesQueueEventMessages\n{\n    /**\n     * Listen for the queue events in order to update the console output.\n     *\n     * @return void\n     */\n    protected function listenForEvents()\n    {\n        $this->laravel['events']->listen(JobProcessing::class, function ($event) {\n            $this->writeOutput($event->job, 'starting');\n        });\n\n        $this->laravel['events']->listen(JobProcessed::class, function ($event) {\n            $this->writeOutput($event->job, 'success');\n        });\n\n        $this->laravel['events']->listen(JobFailed::class, function ($event) {\n            $this->writeOutput($event->job, 'failed');\n\n            $this->logFailedJob($event);\n        });\n    }\n\n    /**\n     * Write the status output for the queue worker.\n     *\n     * @param  \\Illuminate\\Contracts\\Queue\\Job  $job\n     * @param  string  $status\n     * @return void\n     */\n    protected function writeOutput(Job $job, $status)\n    {\n        switch ($status) {\n            case 'starting':\n                return $this->writeStatus($job, 'Processing', 'comment');\n            case 'success':\n                return $this->writeStatus($job, 'Processed', 'info');\n            case 'failed':\n                return $this->writeStatus($job, 'Failed', 'error');\n        }\n    }\n\n    /**\n     * Format the status output for the queue worker.\n     *\n     * @param  \\Illuminate\\Contracts\\Queue\\Job  $job\n     * @param  string  $status\n     * @param  string  $type\n     * @return void\n     */\n    protected function writeStatus(Job $job, $status, $type)\n    {\n        $this->output->writeln(sprintf(\n            \"<{$type}>%s</{$type}> %s\",\n            str_pad(\"{$status}:\", 11), $job->resolveName()\n        ));\n    }\n}\n"
  },
  {
    "path": "src/Contracts/LambdaEventHandler.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Contracts;\n\ninterface LambdaEventHandler\n{\n    /**\n     * Handle an incoming Lambda event.\n     *\n     * @param  array  $event\n     * @return \\Laravel\\Vapor\\Contracts\\LambdaResponse\n     */\n    public function handle(array $event);\n}\n"
  },
  {
    "path": "src/Contracts/LambdaResponse.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Contracts;\n\ninterface LambdaResponse\n{\n    /**\n     * Convert the response to API Gateway's supported format.\n     *\n     * @return array\n     */\n    public function toApiGatewayFormat();\n}\n"
  },
  {
    "path": "src/Contracts/SignedStorageUrlController.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Contracts;\n\nuse Illuminate\\Http\\Request;\n\ninterface SignedStorageUrlController\n{\n    /**\n     * Create a new signed URL.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return \\Illuminate\\Http\\Response\n     */\n    public function store(Request $request);\n}\n"
  },
  {
    "path": "src/DefinesRoutes.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor;\n\nuse Illuminate\\Support\\Facades\\Route;\n\ntrait DefinesRoutes\n{\n    /**\n     * Ensure that Vapor's internal routes are defined.\n     *\n     * @return void\n     */\n    public function ensureRoutesAreDefined()\n    {\n        if ($this->app->routesAreCached()) {\n            return;\n        }\n\n        if (config('vapor.signed_storage.enabled', true)) {\n            Route::post(\n                config('vapor.signed_storage.url', '/vapor/signed-storage-url'),\n                Contracts\\SignedStorageUrlController::class.'@store'\n            )->middleware(config('vapor.middleware', 'web'));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Events/LambdaEvent.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Events;\n\nuse ArrayAccess;\nuse Illuminate\\Contracts\\Support\\Arrayable;\nuse Illuminate\\Support\\Arr;\n\nclass LambdaEvent implements ArrayAccess, Arrayable\n{\n    /**\n     * The underlying event.\n     *\n     * @var array\n     */\n    protected $event;\n\n    /**\n     * Creates a new event instance.\n     *\n     * @param  array  $event\n     * @return void\n     */\n    public function __construct($event)\n    {\n        $this->event = $event;\n    }\n\n    /**\n     * Determine if an item exists at an offset.\n     *\n     * @param  string  $key\n     * @return bool\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetExists($key)\n    {\n        return Arr::exists($this->event, $key);\n    }\n\n    /**\n     * Get an item at a given offset.\n     *\n     * @param  string  $key\n     * @return array|string|int\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetGet($key)\n    {\n        return Arr::get($this->event, $key);\n    }\n\n    /**\n     * Set the item at a given offset.\n     *\n     * @param  string  $key\n     * @param  array|string|int  $value\n     * @return void\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetSet($key, $value)\n    {\n        Arr::set($this->event, $key, $value);\n    }\n\n    /**\n     * Unset the item at a given offset.\n     *\n     * @param  string  $key\n     * @return void\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetUnset($key)\n    {\n        Arr::forget($this->event, $key);\n    }\n\n    /**\n     * Get the instance as an array.\n     *\n     * @return array\n     */\n    public function toArray()\n    {\n        return $this->event;\n    }\n}\n"
  },
  {
    "path": "src/HasAwsContext.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor;\n\ntrait HasAwsContext\n{\n    /**\n     * Get the current AWS request ID.\n     *\n     * @return string|null The AWS request ID if available.\n     */\n    public static function requestId(): ?string\n    {\n        return $_ENV['AWS_REQUEST_ID'] ?? null;\n    }\n\n    /**\n     * Get the AWS Lambda function name.\n     *\n     * @return string|null The Lambda function name if available.\n     */\n    public static function functionName(): ?string\n    {\n        return $_ENV['AWS_LAMBDA_FUNCTION_NAME'] ?? null;\n    }\n\n    /**\n     * Get the AWS Lambda function version.\n     *\n     * @return string|null The Lambda function version if available.\n     */\n    public static function functionVersion(): ?string\n    {\n        return $_ENV['AWS_LAMBDA_FUNCTION_VERSION'] ?? null;\n    }\n\n    /**\n     * Get the AWS CloudWatch log group name.\n     *\n     * @return string|null The CloudWatch log group name if available.\n     */\n    public static function logGroupName(): ?string\n    {\n        return $_ENV['AWS_LAMBDA_LOG_GROUP_NAME'] ?? null;\n    }\n\n    /**\n     * Get the AWS CloudWatch log stream name.\n     *\n     * @return string|null The CloudWatch log stream name if available.\n     */\n    public static function logStreamName(): ?string\n    {\n        return $_ENV['AWS_LAMBDA_LOG_STREAM_NAME'] ?? null;\n    }\n\n    /**\n     * Get the AWS execution context for the current Vapor environment.\n     *\n     * @return array{\n     *     request_id: string|null,\n     *     function_name: string|null,\n     *     function_version: string|null,\n     *     log_group_name: string|null,\n     *     log_stream_name: string|null\n     * }\n     */\n    protected function awsContext(): array\n    {\n        return [\n            'request_id' => self::requestId(),\n            'function_name' => self::functionName(),\n            'function_version' => self::functionVersion(),\n            'log_group_name' => self::logGroupName(),\n            'log_stream_name' => self::logStreamName(),\n        ];\n    }\n}\n"
  },
  {
    "path": "src/Http/Controllers/SignedStorageUrlController.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Http\\Controllers;\n\nuse Aws\\S3\\S3Client;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Routing\\Controller;\nuse Illuminate\\Support\\Facades\\Gate;\nuse Illuminate\\Support\\Str;\nuse InvalidArgumentException;\nuse Laravel\\Vapor\\Contracts\\SignedStorageUrlController as SignedStorageUrlControllerContract;\n\nclass SignedStorageUrlController extends Controller implements SignedStorageUrlControllerContract\n{\n    /**\n     * Create a new signed URL.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return \\Illuminate\\Http\\JsonResponse\n     */\n    public function store(Request $request)\n    {\n        $this->ensureEnvironmentVariablesAreAvailable($request);\n\n        Gate::authorize('uploadFiles', [\n            $request->user(),\n            $bucket = $request->input('bucket') ?: $_ENV['AWS_BUCKET'],\n        ]);\n\n        $client = $this->storageClient();\n\n        $uuid = (string) Str::uuid();\n\n        $expiresAfter = config('vapor.signed_storage_url_expires_after', 5);\n\n        $signedRequest = $client->createPresignedRequest(\n            $this->createCommand($request, $client, $bucket, $key = $this->getKey($uuid)),\n            sprintf('+%s minutes', $expiresAfter)\n        );\n\n        $uri = $signedRequest->getUri();\n\n        return response()->json([\n            'uuid' => $uuid,\n            'bucket' => $bucket,\n            'key' => $key,\n            'url' => $uri->getScheme().'://'.$uri->getAuthority().$uri->getPath().'?'.$uri->getQuery(),\n            'headers' => $this->headers($request, $signedRequest),\n        ], 201);\n    }\n\n    /**\n     * Create a command for the PUT operation.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  \\Aws\\S3\\S3Client  $client\n     * @param  string  $bucket\n     * @param  string  $key\n     * @return \\Aws\\Command\n     */\n    protected function createCommand(Request $request, S3Client $client, $bucket, $key)\n    {\n        return $client->getCommand('putObject', array_filter([\n            'Bucket' => $bucket,\n            'Key' => $key,\n            'ACL' => $request->input('visibility') ?: $this->defaultVisibility(),\n            'ContentType' => $request->input('content_type') ?: 'application/octet-stream',\n            'CacheControl' => $request->input('cache_control') ?: null,\n            'Expires' => $request->input('expires') ?: null,\n        ]));\n    }\n\n    /**\n     * Get the headers that should be used when making the signed request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  \\GuzzleHttp\\Psr7\\Request\n     * @return array\n     */\n    protected function headers(Request $request, $signedRequest)\n    {\n        return array_merge(\n            $signedRequest->getHeaders(),\n            [\n                'Content-Type' => $request->input('content_type') ?: 'application/octet-stream',\n            ]\n        );\n    }\n\n    /**\n     * Ensure the required environment variables are available.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return void\n     */\n    protected function ensureEnvironmentVariablesAreAvailable(Request $request)\n    {\n        $missing = array_diff_key(array_flip(array_filter([\n            $request->input('bucket') ? null : 'AWS_BUCKET',\n            'AWS_DEFAULT_REGION',\n            'AWS_ACCESS_KEY_ID',\n            'AWS_SECRET_ACCESS_KEY',\n        ])), $_ENV);\n\n        if (empty($missing)) {\n            return;\n        }\n\n        throw new InvalidArgumentException(\n            'Unable to issue signed URL. Missing environment variables: '.implode(', ', array_keys($missing))\n        );\n    }\n\n    /**\n     * Get the S3 storage client instance.\n     *\n     * @return \\Aws\\S3\\S3Client\n     */\n    protected function storageClient()\n    {\n        $config = [\n            'region' => config('filesystems.disks.s3.region', $_ENV['AWS_DEFAULT_REGION']),\n            'version' => 'latest',\n            'signature_version' => 'v4',\n            'use_path_style_endpoint' => config('filesystems.disks.s3.use_path_style_endpoint', false),\n        ];\n\n        if (! isset($_ENV['AWS_LAMBDA_FUNCTION_VERSION'])) {\n            $config['credentials'] = array_filter([\n                'key' => $_ENV['AWS_ACCESS_KEY_ID'] ?? null,\n                'secret' => $_ENV['AWS_SECRET_ACCESS_KEY'] ?? null,\n                'token' => $_ENV['AWS_SESSION_TOKEN'] ?? null,\n            ]);\n\n            if (array_key_exists('AWS_URL', $_ENV) && ! is_null($_ENV['AWS_URL'])) {\n                $config['url'] = $_ENV['AWS_URL'];\n                $config['endpoint'] = $_ENV['AWS_URL'];\n            }\n\n            if (array_key_exists('AWS_ENDPOINT', $_ENV) && ! is_null($_ENV['AWS_ENDPOINT'])) {\n                $config['endpoint'] = $_ENV['AWS_ENDPOINT'];\n            }\n        }\n\n        return new S3Client($config);\n    }\n\n    /**\n     * Get key for the given UUID.\n     *\n     * @param  string  $uuid\n     * @return string\n     */\n    protected function getKey(string $uuid)\n    {\n        return 'tmp/'.$uuid;\n    }\n\n    /**\n     * Get the default visibility for uploads.\n     *\n     * @return string\n     */\n    protected function defaultVisibility()\n    {\n        return 'private';\n    }\n}\n"
  },
  {
    "path": "src/Http/Middleware/ServeStaticAssets.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Http\\Middleware;\n\nuse Closure;\nuse GuzzleHttp\\Client;\nuse GuzzleHttp\\Exception\\ClientException;\n\nclass ServeStaticAssets\n{\n    /**\n     * Handle an incoming request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  \\Closure  $next\n     * @param  string|null  ...$guards\n     * @return mixed\n     */\n    public function handle($request, Closure $next, ...$guards)\n    {\n        $response = $next($request);\n\n        if (isset($_ENV['VAPOR_SSM_PATH']) && $response->getStatusCode() === 404) {\n            $requestUri = $request->getRequestUri();\n\n            if (! in_array(ltrim($requestUri, '/'), config('vapor.serve_assets', []))) {\n                return $response;\n            }\n\n            $asset = null;\n\n            try {\n                $asset = (new Client)->get(asset($requestUri));\n            } catch (ClientException $e) {\n                report($e);\n            }\n\n            if ($asset && $asset->getStatusCode() === 200) {\n                $headers = collect($asset->getHeaders())\n                    ->only(['Content-Length', 'Content-Type'])\n                    ->all();\n\n                return response($asset->getBody())->withHeaders($headers);\n            }\n        }\n\n        return $response;\n    }\n}\n"
  },
  {
    "path": "src/Logging/JsonFormatter.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Logging;\n\nuse Monolog\\Formatter\\JsonFormatter as BaseJsonFormatter;\nuse Monolog\\LogRecord;\n\nclass JsonFormatter extends BaseJsonFormatter\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function format($record): string\n    {\n        $context = ['aws_request_id' => ($_ENV['AWS_REQUEST_ID'] ?? null)];\n\n        if ($record instanceof LogRecord) {\n            $record = new LogRecord(\n                $record->datetime,\n                $record->channel,\n                $record->level,\n                $record->message,\n                array_merge($record->context, $context),\n                $record->extra,\n                $record->formatted\n            );\n        } else {\n            $record['context'] = array_merge(\n                $record['context'] ?? [], $context\n            );\n        }\n\n        return parent::format($record);\n    }\n}\n"
  },
  {
    "path": "src/Queue/JobAttempts.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Queue;\n\nuse Illuminate\\Contracts\\Cache\\Repository as Cache;\nuse Illuminate\\Contracts\\Queue\\Job;\n\nclass JobAttempts\n{\n    /**\n     * The number of seconds job attempts should remain on cache.\n     */\n    const TTL = 1209600;\n\n    /**\n     * The cache repository implementation.\n     *\n     * @var \\Illuminate\\Contracts\\Cache\\Repository\n     */\n    protected $cache;\n\n    /**\n     * Create a new job attempts instance.\n     *\n     * @param  \\Illuminate\\Contracts\\Cache\\Repository  $cache\n     * @return void\n     */\n    public function __construct(Cache $cache)\n    {\n        $this->cache = $cache;\n    }\n\n    /**\n     * Determine if the job have been attempted before.\n     *\n     * @param  \\Illuminate\\Contracts\\Queue\\Job|string  $job\n     * @return bool\n     */\n    protected function has($job)\n    {\n        return ! is_null($this->cache->get($this->key($job)));\n    }\n\n    /**\n     * Get the number of times the job has been attempted.\n     *\n     * @param  \\Illuminate\\Contracts\\Queue\\Job|string  $job\n     * @return int\n     */\n    public function get($job)\n    {\n        return (int) $this->cache->get($this->key($job), 0);\n    }\n\n    /**\n     * Increment the number of times the job has been attempted.\n     *\n     * @param  \\Illuminate\\Contracts\\Queue\\Job  $job\n     * @return void\n     */\n    public function increment($job)\n    {\n        if ($this->has($job)) {\n            $this->cache->increment($this->key($job));\n\n            return;\n        }\n\n        $this->cache->put($this->key($job), 1, static::TTL);\n    }\n\n    /**\n     * Transfer the job attempts from one job to another.\n     *\n     * @param  \\Illuminate\\Contracts\\Queue\\Job|string  $from\n     * @param  \\Illuminate\\Contracts\\Queue\\Job|string  $to\n     * @return void\n     */\n    public function transfer($from, $to)\n    {\n        $this->cache->put($this->key($to), $this->get($from), static::TTL);\n\n        $this->cache->forget($this->key($from));\n    }\n\n    /**\n     * Forget the number of times the job has been attempted.\n     *\n     * @param  \\Illuminate\\Contracts\\Queue\\Job|string  $job\n     * @return null\n     */\n    public function forget($job)\n    {\n        $this->cache->forget($this->key($job));\n    }\n\n    /**\n     * Gets the cache key for the given job.\n     *\n     * @param  \\Illuminate\\Contracts\\Queue\\Job|string  $job\n     * @return string\n     */\n    protected function key($job)\n    {\n        $jobId = $job instanceof Job ? $job->getJobId() : $job;\n\n        return 'laravel_vapor_job_attempts:'.$jobId;\n    }\n}\n"
  },
  {
    "path": "src/Queue/VaporConnector.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Queue;\n\nuse Aws\\Sqs\\SqsClient;\nuse Illuminate\\Queue\\Connectors\\ConnectorInterface;\nuse Illuminate\\Support\\Arr;\n\nclass VaporConnector implements ConnectorInterface\n{\n    /**\n     * Establish a queue connection.\n     *\n     * @param  array  $config\n     * @return \\Illuminate\\Contracts\\Queue\\Queue\n     */\n    public function connect(array $config)\n    {\n        $config = $this->getDefaultConfiguration($config);\n\n        if ($config['key'] && $config['secret']) {\n            $config['credentials'] = Arr::only($config, ['key', 'secret', 'token']);\n        }\n\n        return new VaporQueue(\n            new SqsClient($config),\n            $config['queue'],\n            $config['prefix'] ?? '',\n            $config['suffix'] ?? '',\n            $config['after_commit'] ?? null\n        );\n    }\n\n    /**\n     * Get the default configuration for SQS.\n     *\n     * @param  array  $config\n     * @return array\n     */\n    protected function getDefaultConfiguration(array $config)\n    {\n        return array_merge([\n            'version' => 'latest',\n            'http' => [\n                'timeout' => 60,\n                'connect_timeout' => 60,\n            ],\n        ], $config);\n    }\n}\n"
  },
  {
    "path": "src/Queue/VaporJob.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Queue;\n\nuse Illuminate\\Queue\\Jobs\\SqsJob;\n\nclass VaporJob extends SqsJob\n{\n    /**\n     * Get the number of times the job has been attempted.\n     *\n     * @return int\n     */\n    public function attempts()\n    {\n        return max(\n            ($this->payload()['attempts'] ?? 0) + 1,\n            $this->container->make(JobAttempts::class)->get($this)\n        );\n    }\n\n    /**\n     * Delete the job from the queue.\n     *\n     * @return void\n     */\n    public function delete()\n    {\n        parent::delete();\n\n        $this->container\n             ->make(JobAttempts::class)\n             ->forget($this);\n    }\n\n    /**\n     * Release the job back into the queue.\n     *\n     * @param  int  $delay\n     * @return void\n     */\n    public function release($delay = 0)\n    {\n        $this->released = true;\n\n        $payload = $this->payload();\n\n        $payload['attempts'] = $this->attempts();\n\n        $this->sqs->deleteMessage([\n            'QueueUrl' => $this->queue,\n            'ReceiptHandle' => $this->job['ReceiptHandle'],\n        ]);\n\n        $jobId = $this->sqs->sendMessage([\n            'QueueUrl' => $this->queue,\n            'MessageBody' => json_encode($payload),\n            'DelaySeconds' => $this->secondsUntil($delay),\n        ])->get('MessageId');\n\n        $this->container\n             ->make(JobAttempts::class)\n             ->transfer($this, $jobId);\n    }\n}\n"
  },
  {
    "path": "src/Queue/VaporQueue.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Queue;\n\nuse Illuminate\\Queue\\SqsQueue;\n\nclass VaporQueue extends SqsQueue\n{\n    /**\n     * Pop the next job off of the queue.\n     *\n     * @param  string  $queue\n     * @return \\Illuminate\\Contracts\\Queue\\Job|null\n     */\n    public function pop($queue = null)\n    {\n        $response = $this->sqs->receiveMessage([\n            'QueueUrl' => $queue = $this->getQueue($queue),\n            'AttributeNames' => ['ApproximateReceiveCount'],\n        ]);\n\n        if (! is_null($response['Messages']) && count($response['Messages']) > 0) {\n            return tap(new VaporJob(\n                $this->container, $this->sqs, $response['Messages'][0],\n                $this->connectionName, $queue\n            ), function ($job) {\n                $this->container\n                     ->make(JobAttempts::class)\n                     ->increment($job);\n            });\n        }\n    }\n\n    /**\n     * Create a payload string from the given job and data.\n     *\n     * @param  string  $job\n     * @param  string  $queue\n     * @param  mixed  $data\n     * @return array\n     */\n    protected function createPayloadArray($job, $queue, $data = '')\n    {\n        return array_merge(parent::createPayloadArray($job, $queue, $data), [\n            'attempts' => 0,\n        ]);\n    }\n}\n"
  },
  {
    "path": "src/Queue/VaporWorker.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Queue;\n\nuse Illuminate\\Queue\\Worker;\nuse Illuminate\\Queue\\WorkerOptions;\nuse Laravel\\Vapor\\VaporJobTimedOutException;\n\nclass VaporWorker extends Worker\n{\n    /**\n     * Process the given job.\n     *\n     * @param  \\Illuminate\\Contracts\\Queue\\Job  $job\n     * @param  string  $connectionName\n     * @param  \\Illuminate\\Queue\\WorkerOptions  $options\n     * @return void\n     */\n    public function runVaporJob($job, $connectionName, WorkerOptions $options)\n    {\n        app()->forgetScopedInstances();\n\n        pcntl_async_signals(true);\n\n        pcntl_signal(SIGALRM, function () use ($job) {\n            throw new VaporJobTimedOutException($job->resolveName());\n        });\n\n        pcntl_alarm(\n            max($this->timeoutForJob($job, $options), 0)\n        );\n\n        app(JobAttempts::class)->increment($job);\n\n        $this->runJob($job, $connectionName, $options);\n\n        pcntl_alarm(0);\n    }\n}\n"
  },
  {
    "path": "src/Runtime/ArrayLambdaResponse.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Laravel\\Vapor\\Contracts\\LambdaResponse;\n\nclass ArrayLambdaResponse implements LambdaResponse\n{\n    /**\n     * The response array.\n     *\n     * @var array\n     */\n    protected $response;\n\n    /**\n     * Create a new response instance.\n     *\n     * @param  array  $response\n     * @return void\n     */\n    public function __construct(array $response)\n    {\n        $this->response = $response;\n    }\n\n    /**\n     * Convert the response to API Gateway's supported format.\n     *\n     * @return array\n     */\n    public function toApiGatewayFormat()\n    {\n        return $this->response;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/CliHandlerFactory.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Laravel\\Vapor\\Runtime\\Handlers\\CliHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\QueueHandler;\n\nclass CliHandlerFactory\n{\n    /**\n     * The custom handler factory callback.\n     *\n     * @var callable|null\n     */\n    protected static $customHandlerFactory;\n\n    /**\n     * Create a new handler for the given CLI event.\n     *\n     * @param  array  $event\n     * @return mixed\n     */\n    public static function make(array $event)\n    {\n        if (static::$customHandlerFactory) {\n            return call_user_func(static::$customHandlerFactory, $event);\n        }\n\n        $messageId = $event['Records'][0]['messageId'] ?? null;\n\n        $job = json_decode($event['Records'][0]['body'] ?? '')->job ?? null;\n\n        return $messageId && $job\n                    ? new QueueHandler\n                    : new CliHandler;\n    }\n\n    /**\n     * Set a custom handler factory callback.\n     *\n     * @param  callable  $callback\n     * @return void\n     */\n    public static function createHandlerUsing(callable $callback)\n    {\n        static::$customHandlerFactory = $callback;\n    }\n\n    /**\n     * Reset the handler factory to its default behavior.\n     *\n     * @return void\n     */\n    public static function createHandlersNormally()\n    {\n        static::$customHandlerFactory = null;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Environment.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Dotenv\\Dotenv;\nuse Illuminate\\Contracts\\Console\\Kernel;\nuse Illuminate\\Contracts\\Foundation\\Application;\nuse Throwable;\n\nclass Environment\n{\n    /**\n     * The writable path for the environment file.\n     *\n     * @var string\n     */\n    protected $writePath = '/tmp';\n\n    /**\n     * The application instance.\n     *\n     * @var \\Illuminate\\Contracts\\Foundation\\Application\n     */\n    protected $app;\n\n    /**\n     * The environment name.\n     *\n     * @var string\n     */\n    protected $environment;\n\n    /**\n     * The environment file name.\n     *\n     * @var string\n     */\n    protected $environmentFile;\n\n    /**\n     * The encrypted environment file name.\n     *\n     * @var string\n     */\n    protected $encryptedFile;\n\n    /**\n     * The console kernel instance.\n     *\n     * @var \\Illuminate\\Contracts\\Console\\Kernel\n     */\n    protected $console;\n\n    /**\n     * Create a new environment manager instance.\n     *\n     * @return void\n     */\n    public function __construct(Application $app)\n    {\n        $this->app = $app;\n\n        $this->environment = $_ENV['VAPOR_ENV'] ?? $_ENV['APP_ENV'] ?? 'production';\n        $this->environmentFile = '.env.'.$this->environment;\n        $this->encryptedFile = '.env.'.$this->environment.'.encrypted';\n    }\n\n    /**\n     * Decrypt the environment file and load it into the runtime.\n     *\n     * @return void\n     */\n    public static function decrypt($app)\n    {\n        (new static($app))->decryptEnvironment();\n    }\n\n    /**\n     * Decrypt the environment file and load it into the runtime.\n     *\n     * @return void\n     */\n    public function decryptEnvironment()\n    {\n        try {\n            if (! $this->canBeDecrypted()) {\n                return;\n            }\n\n            $this->copyEncryptedFile();\n\n            $this->decryptFile();\n\n            $this->loadEnvironment();\n        } catch (Throwable $e) {\n            function_exists('__vapor_debug') && __vapor_debug($e->getMessage());\n        }\n    }\n\n    /**\n     * Determine if it is possible to decrypt the environment file.\n     *\n     * @return bool\n     */\n    public function canBeDecrypted()\n    {\n        if (! isset($_ENV['LARAVEL_ENV_ENCRYPTION_KEY'])) {\n            return false;\n        }\n\n        if (version_compare($this->app->version(), '9.37.0', '<')) {\n            function_exists('__vapor_debug') && __vapor_debug('Decrypt command not available.');\n\n            return false;\n        }\n\n        if (! file_exists($this->app->basePath($this->encryptedFile))) {\n            function_exists('__vapor_debug') && __vapor_debug('Encrypted environment file not found.');\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Copy the encrypted environment file to the writable path.\n     *\n     * @return void\n     */\n    public function copyEncryptedFile()\n    {\n        copy(\n            $this->app->basePath($this->encryptedFile),\n            $this->writePath.DIRECTORY_SEPARATOR.$this->encryptedFile\n        );\n    }\n\n    /**\n     * Decrypt the environment file.\n     *\n     * @return void\n     */\n    public function decryptFile()\n    {\n        function_exists('__vapor_debug') && __vapor_debug('Decrypting environment variables.');\n\n        $this->console()->call('env:decrypt', ['--env' => $this->environment, '--path' => $this->writePath]);\n    }\n\n    /**\n     * Load the decrypted environment file.\n     *\n     * @return void\n     */\n    public function loadEnvironment()\n    {\n        function_exists('__vapor_debug') && __vapor_debug('Loading decrypted environment variables.');\n\n        Dotenv::createMutable($this->writePath, $this->environmentFile)->load();\n    }\n\n    /**\n     * Get the console kernel implementation.\n     *\n     * @return \\Illuminate\\Contracts\\Console\\Kernel\n     */\n    public function console()\n    {\n        if (! $this->console) {\n            $this->console = $this->app->make(Kernel::class);\n        }\n\n        return $this->console;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Fpm/ActsAsFastCgiDataProvider.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Fpm;\n\ntrait ActsAsFastCgiDataProvider\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function getGatewayInterface(): string\n    {\n        return 'FastCGI/1.0';\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getRequestMethod(): string\n    {\n        return $this->serverVariables['REQUEST_METHOD'];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getScriptFilename(): string\n    {\n        return $this->serverVariables['SCRIPT_FILENAME'];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getServerSoftware(): string\n    {\n        return 'vapor';\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getRemoteAddress(): string\n    {\n        return $this->serverVariables['REMOTE_ADDR'];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getRemotePort(): int\n    {\n        return $this->serverVariables['SERVER_PORT'];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getServerAddress(): string\n    {\n        return $this->serverVariables['SERVER_ADDR'];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getServerPort(): int\n    {\n        return $this->serverVariables['SERVER_PORT'];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getServerName(): string\n    {\n        return $this->serverVariables['SERVER_NAME'];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getServerProtocol(): string\n    {\n        return $this->serverVariables['SERVER_PROTOCOL'];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getContentType(): string\n    {\n        return $this->serverVariables['CONTENT_TYPE'];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getContentLength(): int\n    {\n        $contentLength = $this->serverVariables['CONTENT_LENGTH'] ?: 0;\n\n        return is_numeric($contentLength) ? (int) $contentLength : 0;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getContent(): string\n    {\n        return $this->body;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getCustomVars(): array\n    {\n        return $this->serverVariables;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getParams(): array\n    {\n        return $this->serverVariables;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getRequestUri(): string\n    {\n        return $this->serverVariables['PATH_INFO'];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getResponseCallbacks(): array\n    {\n        return [];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getFailureCallbacks(): array\n    {\n        return [];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getPassThroughCallbacks(): array\n    {\n        return [];\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Fpm/Fpm.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Fpm;\n\nuse Exception;\nuse hollodotme\\FastCGI\\Client;\nuse hollodotme\\FastCGI\\SocketConnections\\UnixDomainSocket;\nuse Symfony\\Component\\Process\\Process;\nuse Throwable;\n\nclass Fpm\n{\n    public const SOCKET = '/tmp/.vapor/php-fpm.sock';\n\n    public const CONFIG = '/tmp/.vapor/php-fpm.conf';\n\n    public const PID_FILE = '/tmp/.vapor/php-fpm.pid';\n\n    /**\n     * The static FPM instance for the container.\n     *\n     * @var static\n     */\n    protected static $instance;\n\n    /**\n     * The file that should be invoked by FPM.\n     *\n     * @var string\n     */\n    protected $handler;\n\n    /**\n     * The additional server variables that should be passed to FPM.\n     *\n     * @var array\n     */\n    protected $serverVariables = [];\n\n    /**\n     * The FPM socket client instance.\n     *\n     * @var \\Hoa\\Socket\\Client\n     */\n    protected $client;\n\n    /**\n     * The FPM socket connection instance.\n     *\n     * @var \\Hoa\\FastCGI\\SocketConnections\\UnixDomainSocket\n     */\n    protected $socketConnection;\n\n    /**\n     * The FPM process instance.\n     *\n     * @var \\Symfony\\Component\\Process\\Process\n     */\n    protected $fpm;\n\n    /**\n     * Create a new FPM instance.\n     *\n     * @param  \\Hoa\\Socket\\Client  $handler\n     * @param  \\Hoa\\FastCGI\\SocketConnections\\UnixDomainSocket  $socketConnection\n     * @return void\n     */\n    public function __construct(Client $client, UnixDomainSocket $socketConnection, string $handler, array $serverVariables = [])\n    {\n        $this->client = $client;\n        $this->handler = $handler;\n        $this->serverVariables = $serverVariables;\n        $this->socketConnection = $socketConnection;\n    }\n\n    /**\n     * Boot FPM with the given handler.\n     *\n     * @param  string  $handler\n     * @return static\n     */\n    public static function boot($handler, array $serverVariables = [])\n    {\n        if (file_exists(static::SOCKET)) {\n            @unlink(static::SOCKET);\n        }\n\n        $socketConnection = new UnixDomainSocket(self::SOCKET, 1000, 900000);\n\n        return static::$instance = tap(new static(new Client, $socketConnection, $handler, $serverVariables), function ($fpm) {\n            $fpm->start();\n        });\n    }\n\n    /**\n     * Resolve the static FPM instance.\n     *\n     * @return static\n     */\n    public static function resolve()\n    {\n        return static::$instance;\n    }\n\n    /**\n     * Start the PHP-FPM process.\n     */\n    public function start()\n    {\n        if ($this->isReady()) {\n            $this->killExistingFpm();\n        }\n\n        function_exists('__vapor_debug') && __vapor_debug('Ensuring ready to start FPM');\n\n        $this->ensureReadyToStart();\n\n        $this->fpm = new Process([\n            'php-fpm',\n            '--nodaemonize',\n            '--force-stderr',\n            '--fpm-config',\n            self::CONFIG,\n        ]);\n\n        function_exists('__vapor_debug') && __vapor_debug('Starting FPM Process...');\n\n        $this->fpm->disableOutput()\n            ->setTimeout(null)\n            ->start(function ($type, $output) {\n                fwrite(STDERR, $output.PHP_EOL);\n            });\n\n        $this->ensureFpmHasStarted();\n    }\n\n    /**\n     * Ensure that the proper configuration is in place to start FPM.\n     *\n     * @return void\n     */\n    protected function ensureReadyToStart()\n    {\n        if (! is_dir(dirname(self::SOCKET))) {\n            mkdir(dirname(self::SOCKET));\n        }\n\n        if (! file_exists(self::CONFIG)) {\n            file_put_contents(\n                self::CONFIG,\n                file_get_contents(__DIR__.'/../../../stubs/php-fpm.conf')\n            );\n        }\n    }\n\n    /**\n     * Proxy the request to PHP-FPM and return its response.\n     *\n     * @param  \\Laravel\\Vapor\\Runtime\\Fpm\\FpmRequest  $request\n     * @return \\Laravel\\Vapor\\Runtime\\Fpm\\FpmResponse\n     */\n    public function handle($request)\n    {\n        return (new FpmApplication($this->client, $this->socketConnection))\n            ->handle($request);\n    }\n\n    /**\n     * Wait until the FPM process is ready to receive requests.\n     *\n     * @return void\n     */\n    protected function ensureFpmHasStarted()\n    {\n        $elapsed = 0;\n\n        while (! $this->isReady()) {\n            usleep(5000);\n\n            $elapsed += 5000;\n\n            if ($elapsed > ($fiveSeconds = 5000000)) {\n                throw new Exception('Timed out waiting for FPM to start: '.self::SOCKET);\n            }\n\n            if (! $this->fpm->isRunning()) {\n                throw new Exception('PHP-FPM was unable to start.');\n            }\n        }\n    }\n\n    /**\n     * Determine is the FPM process is ready to receive requests.\n     *\n     * @return bool\n     */\n    protected function isReady()\n    {\n        clearstatcache(false, self::SOCKET);\n\n        return file_exists(self::SOCKET);\n    }\n\n    /**\n     * Ensure that the FPM process is still running.\n     *\n     * @return void\n     *\n     * @throws \\Exception\n     */\n    public function ensureRunning()\n    {\n        try {\n            if (! $this->fpm || ! $this->fpm->isRunning()) {\n                throw new Exception('PHP-FPM has stopped unexpectedly.');\n            }\n        } catch (Throwable $e) {\n            function_exists('__vapor_debug') && __vapor_debug($e->getMessage());\n\n            exit(1);\n        }\n    }\n\n    /**\n     * Stop the FPM process.\n     *\n     * @return void\n     */\n    public function stop()\n    {\n        if ($this->fpm && $this->fpm->isRunning()) {\n            $this->fpm->stop();\n        }\n    }\n\n    /**\n     * Kill any existing FPM processes on the system.\n     *\n     * @return void\n     */\n    protected function killExistingFpm()\n    {\n        function_exists('__vapor_debug') && __vapor_debug('Killing existing FPM');\n\n        if (! file_exists(static::PID_FILE)) {\n            return unlink(static::SOCKET);\n        }\n\n        $pid = (int) file_get_contents(static::PID_FILE);\n\n        if (posix_getpgid($pid) === false) {\n            return $this->removeFpmProcessFiles();\n        }\n\n        $result = posix_kill($pid, SIGTERM);\n\n        if ($result === false) {\n            return $this->removeFpmProcessFiles();\n        }\n\n        $this->waitUntilStopped($pid);\n\n        $this->removeFpmProcessFiles();\n    }\n\n    /**\n     * Remove FPM's process related files.\n     *\n     * @return void\n     */\n    protected function removeFpmProcessFiles()\n    {\n        unlink(static::SOCKET);\n        unlink(static::PID_FILE);\n    }\n\n    /**\n     * Wait until the given process is stopped.\n     *\n     * @param  int  $pid\n     * @return void\n     */\n    protected function waitUntilStopped($pid)\n    {\n        $elapsed = 0;\n\n        while (posix_getpgid($pid) !== false) {\n            usleep(5000);\n\n            $elapsed += 5000;\n\n            if ($elapsed > 1000000) {\n                throw new Exception('Process did not stop within the given threshold.');\n            }\n        }\n    }\n\n    /**\n     * Get the underlying process.\n     *\n     * @return \\Symfony\\Component\\Process\\Process\n     */\n    public function process()\n    {\n        return $this->fpm;\n    }\n\n    /**\n     * Get the handler.\n     *\n     * @return string\n     */\n    public function handler()\n    {\n        return $this->handler;\n    }\n\n    /**\n     * Get the server variables.\n     *\n     * @return array\n     */\n    public function serverVariables()\n    {\n        return $this->serverVariables;\n    }\n\n    /**\n     * Handle the destruction of the class.\n     *\n     * @return void\n     */\n    public function __destruct()\n    {\n        $this->stop();\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Fpm/FpmApplication.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Fpm;\n\nuse hollodotme\\FastCGI\\Client;\nuse hollodotme\\FastCGI\\SocketConnections\\UnixDomainSocket;\n\nclass FpmApplication\n{\n    /**\n     * The socket client instance.\n     *\n     * @var \\Hoa\\Socket\\Client\n     */\n    protected $client;\n\n    /**\n     * The FPM socket connection instance.\n     *\n     * @var \\Hoa\\FastCGI\\SocketConnections\\UnixDomainSocket\n     */\n    protected $socketConnection;\n\n    /**\n     * Create a new FPM application instance.\n     *\n     * @param  \\hollodotme\\FastCGI\\Client  $client\n     * @param  \\Hoa\\FastCGI\\SocketConnections\\UnixDomainSocket  $socketConnection\n     * @return void\n     */\n    public function __construct(Client $client, UnixDomainSocket $socketConnection)\n    {\n        $this->client = $client;\n        $this->socketConnection = $socketConnection;\n    }\n\n    /**\n     * Handle the given FPM request.\n     *\n     * @param  \\Laravel\\Vapor\\Runtime\\Fpm\\FpmRequest  $request\n     * @return \\Laravel\\Vapor\\Runtime\\Fpm\\FpmResponse\n     */\n    public function handle(FpmRequest $request)\n    {\n        return new FpmResponse(\n            $this->client->sendRequest($this->socketConnection, $request)\n        );\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Fpm/FpmHttpHandlerFactory.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Fpm;\n\nuse Laravel\\Vapor\\Runtime\\Handlers\\FpmHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\LoadBalancedFpmHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\PayloadFormatVersion2FpmHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\UnknownEventHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\WarmerHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\WarmerPingHandler;\n\nclass FpmHttpHandlerFactory\n{\n    /**\n     * Create a new handler for the given HTTP event.\n     *\n     * @param  array  $event\n     * @return \\Laravel\\Vapor\\Contracts\\LambdaEventHandler\n     */\n    public static function make(array $event)\n    {\n        if (isset($event['vaporWarmer'])) {\n            return new WarmerHandler;\n        } elseif (isset($event['vaporWarmerPing'])) {\n            return new WarmerPingHandler;\n        } elseif (isset($event['requestContext']['elb'])) {\n            return new LoadBalancedFpmHandler;\n        } elseif (isset($event['version']) && $event['version'] === '2.0') {\n            return new PayloadFormatVersion2FpmHandler;\n        } elseif (isset($event['httpMethod']) || isset($event['requestContext']['http']['method'])) {\n            return new FpmHandler;\n        }\n\n        return new UnknownEventHandler;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Fpm/FpmRequest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Fpm;\n\nuse hollodotme\\FastCGI\\Interfaces\\ProvidesRequestData;\nuse Laravel\\Vapor\\Runtime\\Request;\n\nclass FpmRequest extends Request implements ProvidesRequestData\n{\n    use ActsAsFastCgiDataProvider;\n}\n"
  },
  {
    "path": "src/Runtime/Fpm/FpmResponse.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Fpm;\n\nuse hollodotme\\FastCGI\\Interfaces\\ProvidesResponseData;\nuse Laravel\\Vapor\\Runtime\\Response;\n\nclass FpmResponse extends Response\n{\n    /**\n     * Create a new FPM response instance.\n     *\n     * @param  \\hollodotme\\FastCGI\\Interfaces\\ProvidesResponseData  $response\n     * @return void\n     */\n    public function __construct(ProvidesResponseData $response)\n    {\n        $headers = FpmResponseHeaders::fromBody($response->getOutput());\n\n        parent::__construct(\n            $response->getBody(),\n            $headers,\n            $this->prepareStatus($headers)\n        );\n    }\n\n    /**\n     * Prepare the status code of the response.\n     *\n     * @return int\n     */\n    protected function prepareStatus(array $headers)\n    {\n        $headers = array_change_key_case($headers, CASE_LOWER);\n\n        return isset($headers['status'][0])\n            ? (int) explode(' ', $headers['status'][0])[0]\n            : 200;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Fpm/FpmResponseHeaders.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Fpm;\n\nclass FpmResponseHeaders\n{\n    /**\n     * Extract the response headers from the raw response.\n     *\n     * @param  string  $body\n     * @return array\n     */\n    public static function fromBody($body)\n    {\n        $headers = [];\n\n        foreach (explode(PHP_EOL, $body) as $line) {\n            if (preg_match('#^([^\\:]+):(.*)$#', $line, $matches)) {\n                $headers[trim($matches[1])][] = trim($matches[2]);\n\n                continue;\n            }\n\n            break;\n        }\n\n        return $headers;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Handlers/CliHandler.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Handlers;\n\nuse GuzzleHttp\\Client;\nuse Illuminate\\Support\\Str;\nuse Laravel\\Vapor\\Contracts\\LambdaEventHandler;\nuse Laravel\\Vapor\\Runtime\\ArrayLambdaResponse;\nuse Symfony\\Component\\Process\\Process;\nuse Throwable;\n\nclass CliHandler implements LambdaEventHandler\n{\n    /**\n     * Handle an incoming Lambda event.\n     *\n     * @return \\Laravel\\Vapor\\Contracts\\LambdaResponse\n     */\n    public function handle(array $event)\n    {\n        $output = '';\n\n        $process = Process::fromShellCommandline(\n            $command = sprintf('php %s/artisan %s --no-interaction 2>&1',\n                $_ENV['LAMBDA_TASK_ROOT'],\n                trim($event['cli'] ?? 'vapor:handle '.base64_encode(json_encode($event)))\n            )\n        )->setTimeout(null);\n\n        $process->run(function ($type, $line) use (&$output) {\n            if (! Str::containsAll($line, ['{\"message\":', '\"level\":'])) {\n                $output .= $line;\n            } else {\n                echo $line.PHP_EOL;\n            }\n        });\n\n        echo $output = json_encode([\n            'output' => $output,\n            'context' => [\n                'command' => $command,\n                'aws_request_id' => $_ENV['AWS_REQUEST_ID'] ?? null,\n            ],\n        ]);\n\n        return new ArrayLambdaResponse(tap([\n            'requestId' => $_ENV['AWS_REQUEST_ID'] ?? null,\n            'logGroup' => $_ENV['AWS_LAMBDA_LOG_GROUP_NAME'] ?? null,\n            'logStream' => $_ENV['AWS_LAMBDA_LOG_STREAM_NAME'] ?? null,\n            'statusCode' => $process->getExitCode(),\n            'output' => base64_encode($output),\n        ], function ($response) use ($event) {\n            $this->ping($event['callback'] ?? null, $response);\n        }));\n    }\n\n    /**\n     * Ping the given callback URL.\n     *\n     * @param  string  $callback\n     * @param  array  $response\n     * @return void\n     */\n    protected function ping($callback, $response)\n    {\n        if (! isset($callback)) {\n            return;\n        }\n\n        try {\n            (new Client)->post($callback, ['json' => $response]);\n        } catch (Throwable $e) {\n            //\n        }\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Handlers/FpmHandler.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Handlers;\n\nuse Laravel\\Vapor\\Contracts\\LambdaEventHandler;\nuse Laravel\\Vapor\\Runtime\\Fpm\\Fpm;\nuse Laravel\\Vapor\\Runtime\\Fpm\\FpmRequest;\nuse Laravel\\Vapor\\Runtime\\LambdaResponse;\n\nclass FpmHandler implements LambdaEventHandler\n{\n    /**\n     * Handle an incoming Lambda event.\n     *\n     * @return \\Laravel\\Vapor\\Contracts\\LambdaResponse\n     */\n    public function handle(array $event)\n    {\n        return $this->response(\n            Fpm::resolve()->handle($this->request($event))\n        );\n    }\n\n    /**\n     * Create a new fpm request from the incoming event.\n     *\n     * @param  array  $event\n     * @return \\Laravel\\Vapor\\Runtime\\Fpm\\FpmRequest\n     */\n    public function request($event)\n    {\n        return FpmRequest::fromLambdaEvent(\n            $event, $this->serverVariables(), Fpm::resolve()->handler()\n        );\n    }\n\n    /**\n     * Covert a response to Lambda-ready response.\n     *\n     * @param  \\Laravel\\Vapor\\Runtime\\Response  $response\n     * @return \\Laravel\\Vapor\\Runtime\\LambdaResponse\n     */\n    public function response($response)\n    {\n        return new LambdaResponse(\n            $response->status,\n            $response->headers,\n            $response->body\n        );\n    }\n\n    /**\n     * Get the server variables.\n     *\n     * @return array\n     */\n    public function serverVariables()\n    {\n        return array_merge(Fpm::resolve()->serverVariables(), array_filter([\n            'AWS_REQUEST_ID' => $_ENV['AWS_REQUEST_ID'] ?? null,\n        ]));\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Handlers/LoadBalancedFpmHandler.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Handlers;\n\nuse Laravel\\Vapor\\Runtime\\LoadBalancedLambdaResponse;\n\nclass LoadBalancedFpmHandler extends FpmHandler\n{\n    /**\n     * Covert a response to Lambda-ready response.\n     *\n     * @param  \\Laravel\\Vapor\\Runtime\\Response  $response\n     * @return \\Laravel\\Vapor\\Runtime\\LoadBalancedLambdaResponse\n     */\n    public function response($response)\n    {\n        return new LoadBalancedLambdaResponse(\n            $response->status,\n            $response->headers,\n            $response->body\n        );\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Handlers/LoadBalancedOctaneHandler.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Handlers;\n\nuse Laravel\\Vapor\\Runtime\\LoadBalancedLambdaResponse;\n\nclass LoadBalancedOctaneHandler extends OctaneHandler\n{\n    /**\n     * Covert a response to Lambda-ready response.\n     *\n     * @param  \\Laravel\\Vapor\\Runtime\\Response  $response\n     * @return \\Laravel\\Vapor\\Runtime\\LoadBalancedLambdaResponse\n     */\n    public function response($response)\n    {\n        return new LoadBalancedLambdaResponse(\n            $response->status,\n            $response->headers,\n            $response->body\n        );\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Handlers/OctaneHandler.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Handlers;\n\nuse Laravel\\Octane\\MarshalsPsr7RequestsAndResponses;\nuse Laravel\\Vapor\\Contracts\\LambdaEventHandler;\nuse Laravel\\Vapor\\Runtime\\LambdaResponse;\nuse Laravel\\Vapor\\Runtime\\Octane\\Octane;\nuse Laravel\\Vapor\\Runtime\\Octane\\OctaneRequestContextFactory;\n\nclass OctaneHandler implements LambdaEventHandler\n{\n    use MarshalsPsr7RequestsAndResponses;\n\n    /**\n     * Handle an incoming Lambda event.\n     *\n     * @param  array  $event\n     * @return \\Laravel\\Vapor\\Contracts\\LambdaResponse\n     */\n    public function handle(array $event)\n    {\n        $request = $this->request($event);\n\n        return $this->response(\n            Octane::handle($request)\n        );\n    }\n\n    /**\n     * Create a new Octane request from the incoming event.\n     *\n     * @param  array  $event\n     * @return \\Laravel\\Octane\\RequestContext\n     */\n    protected function request($event)\n    {\n        return OctaneRequestContextFactory::fromEvent($event, $this->serverVariables());\n    }\n\n    /**\n     * Covert a response to Lambda-ready response.\n     *\n     * @param  \\Laravel\\Vapor\\Runtime\\Response  $response\n     * @return \\Laravel\\Vapor\\Runtime\\LambdaResponse\n     */\n    protected function response($response)\n    {\n        return new LambdaResponse(\n            $response->status,\n            $response->headers,\n            $response->body\n        );\n    }\n\n    /**\n     * Get the server variables.\n     *\n     * @return array\n     */\n    public function serverVariables()\n    {\n        return [\n            'AWS_REQUEST_ID' => $_ENV['AWS_REQUEST_ID'] ?? null,\n        ];\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Handlers/PayloadFormatVersion2FpmHandler.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Handlers;\n\nuse Laravel\\Vapor\\Contracts\\LambdaEventHandler;\nuse Laravel\\Vapor\\Runtime\\PayloadFormatVersion2LambdaResponse;\n\nclass PayloadFormatVersion2FpmHandler extends FpmHandler implements LambdaEventHandler\n{\n    /**\n     * Covert a response to Lambda-ready response.\n     *\n     * @param  \\Laravel\\Vapor\\Runtime\\Response  $response\n     * @return \\Laravel\\Vapor\\Runtime\\LambdaResponse\n     */\n    public function response($response)\n    {\n        return new PayloadFormatVersion2LambdaResponse(\n            $response->status,\n            $response->headers,\n            $response->body\n        );\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Handlers/PayloadFormatVersion2OctaneHandler.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Handlers;\n\nuse Laravel\\Vapor\\Contracts\\LambdaEventHandler;\nuse Laravel\\Vapor\\Runtime\\PayloadFormatVersion2LambdaResponse;\n\nclass PayloadFormatVersion2OctaneHandler extends OctaneHandler implements LambdaEventHandler\n{\n    /**\n     * Covert a response to Lambda-ready response.\n     *\n     * @param  \\Laravel\\Vapor\\Runtime\\Response  $response\n     * @return \\Laravel\\Vapor\\Runtime\\LambdaResponse\n     */\n    protected function response($response)\n    {\n        return new PayloadFormatVersion2LambdaResponse(\n            $response->status,\n            $response->headers,\n            $response->body\n        );\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Handlers/QueueHandler.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Handlers;\n\nuse Illuminate\\Contracts\\Console\\Kernel;\nuse Laravel\\Vapor\\Contracts\\LambdaEventHandler;\nuse Laravel\\Vapor\\Events\\LambdaEvent;\nuse Laravel\\Vapor\\Runtime\\ArrayLambdaResponse;\nuse Laravel\\Vapor\\Runtime\\StorageDirectories;\nuse Symfony\\Component\\Console\\Input\\StringInput;\nuse Symfony\\Component\\Console\\Output\\BufferedOutput;\n\nclass QueueHandler implements LambdaEventHandler\n{\n    /**\n     * The cached application instance.\n     *\n     * @var \\Illuminate\\Foundation\\Application\n     */\n    public static $app;\n\n    /**\n     * Create a new Queue handler instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        if (! isset(static::$app)) {\n            static::$app = require $_ENV['LAMBDA_TASK_ROOT'].'/bootstrap/app.php';\n        }\n    }\n\n    /**\n     * Handle an incoming Lambda event.\n     *\n     * @param  array  $event\n     * @return ArrayLambdaResponse\n     */\n    public function handle(array $event)\n    {\n        $commandOptions = trim(sprintf(\n            '--delay=%s --timeout=%s --tries=%s %s',\n            $_ENV['SQS_DELAY'] ?? 3,\n            $_ENV['QUEUE_TIMEOUT'] ?? 0,\n            $_ENV['SQS_TRIES'] ?? 3,\n            ($_ENV['SQS_FORCE'] ?? false) ? '--force' : ''\n        ));\n\n        try {\n            static::$app->useStoragePath(StorageDirectories::PATH);\n\n            $consoleKernel = static::$app->make(Kernel::class);\n\n            static::$app->bind(LambdaEvent::class, function () use ($event) {\n                return new LambdaEvent($event);\n            });\n\n            $consoleInput = new StringInput(\n                'vapor:work '.$commandOptions.' --no-interaction'\n            );\n\n            $status = $consoleKernel->handle(\n                $consoleInput, $output = new BufferedOutput\n            );\n\n            $consoleKernel->terminate($consoleInput, $status);\n\n            return new ArrayLambdaResponse([\n                'requestId' => $_ENV['AWS_REQUEST_ID'] ?? null,\n                'logGroup' => $_ENV['AWS_LAMBDA_LOG_GROUP_NAME'] ?? null,\n                'logStream' => $_ENV['AWS_LAMBDA_LOG_STREAM_NAME'] ?? null,\n                'statusCode' => $status,\n                'output' => base64_encode($output->fetch()),\n            ]);\n        } finally {\n            unset(static::$app[LambdaEvent::class]);\n\n            $this->terminate();\n        }\n    }\n\n    /**\n     * Terminate any relevant application services.\n     *\n     * @return void\n     */\n    protected function terminate()\n    {\n        if (static::$app->resolved('db') && ($_ENV['VAPOR_QUEUE_DATABASE_SESSION_PERSIST'] ?? false) !== 'true') {\n            collect(static::$app->make('db')->getConnections())->each->disconnect();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Handlers/UnknownEventHandler.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Handlers;\n\nuse Laravel\\Vapor\\Contracts\\LambdaEventHandler;\nuse Laravel\\Vapor\\Runtime\\ArrayLambdaResponse;\nuse Laravel\\Vapor\\Runtime\\Logger;\n\nclass UnknownEventHandler implements LambdaEventHandler\n{\n    /**\n     * Handle an incoming Lambda event.\n     *\n     * @param  array  $event\n     * @return \\Laravel\\Vapor\\Contracts\\LambdaResponse\n     */\n    public function handle(array $event)\n    {\n        Logger::info('Unknown event type received by application.', [\n            'event' => $event,\n        ]);\n\n        return new ArrayLambdaResponse([\n            'output' => 'Unknown event type.',\n        ]);\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Handlers/WarmerHandler.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Handlers;\n\nuse Aws\\Lambda\\LambdaClient;\nuse GuzzleHttp\\Promise\\Utils;\nuse Laravel\\Vapor\\Contracts\\LambdaEventHandler;\nuse Laravel\\Vapor\\Runtime\\ArrayLambdaResponse;\nuse Laravel\\Vapor\\Runtime\\Logger;\nuse Throwable;\n\nclass WarmerHandler implements LambdaEventHandler\n{\n    /**\n     * Handle an incoming Lambda event.\n     *\n     * @return \\Laravel\\Vapor\\Contracts\\LambdaResponse\n     */\n    public function handle(array $event)\n    {\n        try {\n            Logger::info('Executing warming requests...');\n\n            Utils::settle(\n                $this->buildPromises($this->lambdaClient(), $event)\n            )->wait();\n        } catch (Throwable $e) {\n            Logger::error($e->getMessage(), ['exception' => $e]);\n        }\n\n        return new ArrayLambdaResponse([\n            'output' => 'Warmer event handled.',\n        ]);\n    }\n\n    /**\n     * Build the array of warmer invocation promises.\n     *\n     * @return array\n     */\n    protected function buildPromises(LambdaClient $lambda, array $event)\n    {\n        return collect(range(1, $event['concurrency'] - 1))\n            ->mapWithKeys(function ($i) use ($lambda, $event) {\n                return ['warmer-'.$i => $lambda->invokeAsync([\n                    'FunctionName' => $event['functionName'],\n                    'Qualifier' => $event['functionAlias'],\n                    'LogType' => 'None',\n                    'Payload' => json_encode(['vaporWarmerPing' => true]),\n                ])];\n            })->all();\n    }\n\n    /**\n     * Get the Lambda client instance.\n     *\n     * @return \\Aws\\Lambda\\LambdaClient\n     */\n    protected function lambdaClient()\n    {\n        return new LambdaClient([\n            'region' => $_ENV['AWS_DEFAULT_REGION'],\n            'version' => 'latest',\n            'http' => [\n                'timeout' => 5,\n                'connect_timeout' => 5,\n            ],\n        ]);\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Handlers/WarmerPingHandler.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Handlers;\n\nuse Laravel\\Vapor\\Contracts\\LambdaEventHandler;\nuse Laravel\\Vapor\\Runtime\\ArrayLambdaResponse;\n\nclass WarmerPingHandler implements LambdaEventHandler\n{\n    /**\n     * Handle an incoming Lambda event.\n     *\n     * @param  array  $event\n     * @return \\Laravel\\Vapor\\Contracts\\LambdaResponse\n     */\n    public function handle(array $event)\n    {\n        usleep(50 * 1000);\n\n        return new ArrayLambdaResponse([\n            'output' => 'Warmer ping handled.',\n        ]);\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Http/Middleware/EnsureBinaryEncoding.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Http\\Middleware;\n\nuse Illuminate\\Support\\Str;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nclass EnsureBinaryEncoding\n{\n    /**\n     * Handle the incoming request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  callable  $next\n     * @return mixed\n     */\n    public function handle($request, $next)\n    {\n        $response = $next($request);\n\n        if (static::isBase64EncodingRequired($response)) {\n            $response->headers->set('X-Vapor-Base64-Encode', 'True');\n        }\n\n        return $response;\n    }\n\n    /**\n     * Determine if base64 encoding is required for the response.\n     *\n     * @param  \\Illuminate\\Http\\Response  $response\n     * @return bool\n     */\n    public static function isBase64EncodingRequired(Response $response): bool\n    {\n        $contentType = strtolower($response->headers->get('Content-Type', 'text/html'));\n\n        if (Str::startsWith($contentType, 'text/') ||\n            Str::contains($contentType, ['xml', 'json'])) {\n            return false;\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Http/Middleware/EnsureOnNakedDomain.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Http\\Middleware;\n\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Support\\Str;\n\nclass EnsureOnNakedDomain\n{\n    /**\n     * Handle the incoming request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  callable  $next\n     * @return mixed\n     */\n    public function handle($request, $next)\n    {\n        if ('https://'.$request->getHttpHost() === $_ENV['APP_VANITY_URL']) {\n            return $next($request);\n        }\n\n        if (config('vapor.redirect_to_root') === true &&\n            strpos($request->getHost(), 'www.') === 0) {\n            return new RedirectResponse(Str::replaceFirst(\n                'www.', '', $request->fullUrl()\n            ), 301);\n        }\n\n        if (config('vapor.redirect_to_root') === false) {\n            $url = parse_url(config('app.url'));\n\n            $nakedHost = preg_replace('#^www\\.(.+\\.)#i', '$1', $url[\n                'host'\n            ]);\n\n            if ($request->getHost() === $nakedHost) {\n                return new RedirectResponse(str_replace(\n                    $request->getScheme().'://',\n                    $request->getScheme().'://www.',\n                    $request->fullUrl()\n                ), 301);\n            }\n        }\n\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Http/Middleware/EnsureVanityUrlIsNotIndexed.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Http\\Middleware;\n\nclass EnsureVanityUrlIsNotIndexed\n{\n    /**\n     * Handle the incoming request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  callable  $next\n     * @return mixed\n     */\n    public function handle($request, $next)\n    {\n        $response = $next($request);\n\n        if ('https://'.$request->getHttpHost() === $_ENV['APP_VANITY_URL']) {\n            $response->headers->set('X-Robots-Tag', 'noindex, nofollow', true);\n        }\n\n        return $response;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Http/Middleware/RedirectStaticAssets.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Http\\Middleware;\n\nuse Illuminate\\Http\\RedirectResponse;\n\nclass RedirectStaticAssets\n{\n    /**\n     * Handle the incoming request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  callable  $next\n     * @return mixed\n     */\n    public function handle($request, $next)\n    {\n        if (config('vapor.redirect_favicon', true) && $request->path() === 'favicon.ico') {\n            return new RedirectResponse($_ENV['ASSET_URL'].'/favicon.ico', 302, [\n                'Cache-Control' => 'public, max-age=3600',\n            ]);\n        }\n\n        if (config('vapor.redirect_robots_txt') && $request->path() === 'robots.txt') {\n            return new RedirectResponse($_ENV['ASSET_URL'].'/robots.txt', 302, [\n                'Cache-Control' => 'public, max-age=3600',\n            ]);\n        }\n\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "src/Runtime/HttpKernel.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Illuminate\\Contracts\\Http\\Kernel as HttpKernelContract;\nuse Illuminate\\Foundation\\Application;\nuse Illuminate\\Foundation\\Http\\MaintenanceModeBypassCookie;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Pipeline\\Pipeline;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Support\\Facades\\Facade;\nuse Laravel\\Vapor\\Runtime\\Http\\Middleware\\EnsureBinaryEncoding;\nuse Laravel\\Vapor\\Runtime\\Http\\Middleware\\EnsureOnNakedDomain;\nuse Laravel\\Vapor\\Runtime\\Http\\Middleware\\EnsureVanityUrlIsNotIndexed;\nuse Laravel\\Vapor\\Runtime\\Http\\Middleware\\RedirectStaticAssets;\nuse Symfony\\Component\\HttpFoundation\\Cookie;\n\nclass HttpKernel\n{\n    /**\n     * The application instance.\n     *\n     * @var \\Illuminate\\Foundation\\Application\n     */\n    protected $app;\n\n    /**\n     * Create a new HTTP kernel instance.\n     *\n     * @param  \\Illuminate\\Foundation\\Application  $app\n     * @return void\n     */\n    public function __construct(Application $app)\n    {\n        $this->app = $app;\n    }\n\n    /**\n     * Handle the incoming HTTP request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return \\Illuminate\\Http\\Response\n     */\n    public function handle(Request $request)\n    {\n        $this->app->useStoragePath(StorageDirectories::PATH);\n\n        if (static::shouldSendMaintenanceModeResponse($request)) {\n            if (\n                isset($_ENV['VAPOR_MAINTENANCE_MODE_SECRET']) &&\n                $_ENV['VAPOR_MAINTENANCE_MODE_SECRET'] == $request->path()\n            ) {\n                $response = static::bypassResponse($_ENV['VAPOR_MAINTENANCE_MODE_SECRET']);\n\n                $this->app->terminate();\n            } elseif (\n                isset($_ENV['VAPOR_MAINTENANCE_MODE_SECRET']) &&\n                static::hasValidBypassCookie($request, $_ENV['VAPOR_MAINTENANCE_MODE_SECRET'])\n            ) {\n                $response = $this->sendRequest($request);\n            } else {\n                if ($request->wantsJson() && file_exists($_ENV['LAMBDA_TASK_ROOT'].'/503.json')) {\n                    $response = JsonResponse::fromJsonString(\n                        file_get_contents($_ENV['LAMBDA_TASK_ROOT'].'/503.json'),\n                        503\n                    );\n                } else {\n                    $response = new Response(\n                        file_get_contents($_ENV['LAMBDA_TASK_ROOT'].'/503.html'),\n                        503\n                    );\n                }\n\n                $this->app->terminate();\n            }\n        } else {\n            $response = $this->sendRequest($request);\n        }\n\n        return $response;\n    }\n\n    /**\n     * Determine if a maintenance mode response should be sent.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return bool\n     */\n    public static function shouldSendMaintenanceModeResponse(Request $request)\n    {\n        return isset($_ENV['VAPOR_MAINTENANCE_MODE']) &&\n            $_ENV['VAPOR_MAINTENANCE_MODE'] === 'true' &&\n            'https://'.$request->getHttpHost() !== $_ENV['APP_VANITY_URL'];\n    }\n\n    /**\n     * Determine if the incoming request has a maintenance mode bypass cookie.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  string  $secret\n     * @return bool\n     */\n    public static function hasValidBypassCookie($request, $secret)\n    {\n        return $request->cookie('laravel_maintenance') &&\n            MaintenanceModeBypassCookie::isValid(\n                $request->cookie('laravel_maintenance'),\n                $secret\n            );\n    }\n\n    /**\n     * Redirect the user back to the root of the application with a maintenance mode bypass cookie.\n     *\n     * @param  string  $secret\n     * @return \\Illuminate\\Http\\RedirectResponse\n     */\n    public static function bypassResponse(string $secret)\n    {\n        $response = new RedirectResponse('/');\n\n        $expiresAt = Carbon::now()->addHours(12);\n        $path = isset($_ENV['VAPOR_MAINTENANCE_MODE_COOKIE_PATH']) ? $_ENV['VAPOR_MAINTENANCE_MODE_COOKIE_PATH'] : '/';\n        $domain = isset($_ENV['VAPOR_MAINTENANCE_MODE_COOKIE_DOMAIN']) ? $_ENV['VAPOR_MAINTENANCE_MODE_COOKIE_DOMAIN'] : null;\n\n        $cookie = new Cookie('laravel_maintenance', base64_encode(json_encode([\n            'expires_at' => $expiresAt->getTimestamp(),\n            'mac' => hash_hmac('sha256', $expiresAt->getTimestamp(), $secret),\n        ])), $expiresAt, $path, $domain);\n\n        $response->headers->setCookie($cookie);\n\n        return $response;\n    }\n\n    /**\n     * Resolve the HTTP kernel for the request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return \\Illuminate\\Contracts\\Http\\Kernel\n     */\n    protected function resolveKernel(Request $request)\n    {\n        return tap($this->app->make(HttpKernelContract::class), function ($kernel) use ($request) {\n            $this->app->instance('request', $request);\n\n            Facade::clearResolvedInstance('request');\n\n            $kernel->bootstrap();\n        });\n    }\n\n    /**\n     * Send the request to the kernel.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return \\Illuminate\\Http\\Response\n     */\n    protected function sendRequest(Request $request)\n    {\n        $kernel = $this->resolveKernel($request);\n\n        $response = (new Pipeline)->send($request)\n            ->through([\n                new EnsureOnNakedDomain,\n                new RedirectStaticAssets,\n                new EnsureVanityUrlIsNotIndexed,\n                new EnsureBinaryEncoding(),\n            ])->then(function ($request) use ($kernel) {\n                return $kernel->handle($request);\n            });\n\n        $kernel->terminate($request, $response);\n\n        return $response;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/LambdaContainer.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Laravel\\Vapor\\Runtime\\Octane\\Octane;\n\nclass LambdaContainer\n{\n    /**\n     * Terminate if the container has handled enough invocations.\n     *\n     * @param  int  $invocations\n     * @param  int  $invocationLimit\n     * @return void\n     */\n    public static function terminateIfInvocationLimitHasBeenReached($invocations, $invocationLimit)\n    {\n        if (empty($invocationLimit)) {\n            return;\n        }\n\n        if ($invocations >= $invocationLimit) {\n            if (interface_exists(\\Laravel\\Octane\\Contracts\\Client::class)) {\n                Octane::terminate();\n            }\n\n            function_exists('__vapor_debug') && __vapor_debug('Killing container. Container has processed '.$invocationLimit.' invocations. ('.$_ENV['AWS_REQUEST_ID'].')');\n\n            exit(0);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Runtime/LambdaInvocation.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Exception;\n\nclass LambdaInvocation\n{\n    /**\n     * The cached curl handler.\n     *\n     * @var resource\n     */\n    protected static $handler;\n\n    /**\n     * Get the next Lambda invocation ID and body.\n     *\n     * @param  string  $apiUrl\n     * @return array\n     */\n    public static function next($apiUrl)\n    {\n        if (is_null(static::$handler)) {\n            static::$handler = curl_init(\"http://{$apiUrl}/2018-06-01/runtime/invocation/next\");\n\n            curl_setopt(static::$handler, CURLOPT_FOLLOWLOCATION, true);\n            curl_setopt(static::$handler, CURLOPT_FAILONERROR, true);\n        }\n\n        // Retrieve the Lambda invocation ID...\n        $invocationId = '';\n\n        curl_setopt(static::$handler, CURLOPT_HEADERFUNCTION, function ($ch, $header) use (&$invocationId) {\n            if (! preg_match('/:\\s*/', $header)) {\n                return strlen($header);\n            }\n\n            [$name, $value] = preg_split('/:\\s*/', $header, 2);\n\n            if (strtolower($name) === 'lambda-runtime-aws-request-id') {\n                $invocationId = trim($value);\n            }\n\n            return strlen($header);\n        });\n\n        // Retrieve the Lambda invocation event body...\n        $body = '';\n\n        curl_setopt(static::$handler, CURLOPT_WRITEFUNCTION, function ($ch, $chunk) use (&$body) {\n            $body .= $chunk;\n\n            return strlen($chunk);\n        });\n\n        curl_exec(static::$handler);\n\n        static::ensureNoErrorsOccurred(\n            $invocationId, $body\n        );\n\n        return [$invocationId, json_decode($body, true)];\n    }\n\n    /**\n     * Ensure no errors occurred retrieving the invocation.\n     *\n     * @param  string  $invocationId\n     * @param  string  $body\n     * @return void\n     */\n    protected static function ensureNoErrorsOccurred($invocationId, $body)\n    {\n        if (curl_error(static::$handler)) {\n            throw new Exception('Failed to retrieve the next Lambda invocation: '.curl_error(static::$handler));\n        }\n\n        if ($invocationId === '') {\n            throw new Exception('Failed to parse the Lambda invocation ID.');\n        }\n\n        if ($body === '') {\n            throw new Exception('The Lambda runtime API returned an empty response.');\n        }\n    }\n}\n"
  },
  {
    "path": "src/Runtime/LambdaResponse.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Laravel\\Vapor\\Contracts\\LambdaResponse as LambdaResponseContract;\nuse stdClass;\n\nclass LambdaResponse implements LambdaResponseContract\n{\n    /**\n     * The response status code.\n     *\n     * @var int\n     */\n    protected $status = 200;\n\n    /**\n     * The response headers.\n     *\n     * @var array\n     */\n    protected $headers;\n\n    /**\n     * The response body.\n     *\n     * @var string\n     */\n    protected $body;\n\n    /**\n     * Create a new Lambda response from an FPM response.\n     *\n     * @param  int  $status\n     * @param  array  $headers\n     * @param  string  $body\n     * @return void\n     */\n    public function __construct(int $status, array $headers, $body)\n    {\n        $this->body = $body;\n        $this->status = $status;\n        $this->headers = $headers;\n    }\n\n    /**\n     * Convert the response to API Gateway's supported format.\n     *\n     * @return array\n     */\n    public function toApiGatewayFormat()\n    {\n        $requiresEncoding = isset($this->headers['x-vapor-base64-encode'][0]);\n\n        return [\n            'isBase64Encoded' => $requiresEncoding,\n            'statusCode' => $this->status,\n            'headers' => empty($this->headers) ? new stdClass : $this->prepareHeaders($this->headers),\n            'body' => $requiresEncoding ? base64_encode($this->body) : $this->body,\n        ];\n    }\n\n    /**\n     * Prepare the given response headers for API Gateway.\n     *\n     * @param  array  $responseHeaders\n     * @return array\n     */\n    protected function prepareHeaders(array $responseHeaders)\n    {\n        $headers = [];\n\n        foreach ($responseHeaders as $name => $values) {\n            $name = $this->normalizeHeaderName($name);\n\n            if ($name == 'Set-Cookie') {\n                $headers = array_merge($headers, $this->buildCookieHeaders($values));\n\n                continue;\n            }\n\n            foreach ($values as $value) {\n                $headers[$name] = $value;\n            }\n        }\n\n        if (! isset($headers['Content-Type'])) {\n            $headers['Content-Type'] = 'text/html';\n        }\n\n        return $headers;\n    }\n\n    /**\n     * Build the Set-Cookie header names using binary casing.\n     *\n     * @param  array  $values\n     * @return array\n     */\n    protected function buildCookieHeaders(array $values)\n    {\n        $headers = [];\n\n        foreach ($values as $index => $value) {\n            $headers[$this->cookiePermutation($index)] = $value;\n        }\n\n        return $headers;\n    }\n\n    /**\n     * Calculate the permutation of Set-Cookie for the current index.\n     *\n     * @param  int  $index\n     * @return string\n     */\n    protected function cookiePermutation($index)\n    {\n        // Hard-coded to support up to 18 cookies for now...\n        switch ($index) {\n            case 0:\n                return 'set-cookie';\n            case 1:\n                return 'Set-cookie';\n            case 2:\n                return 'sEt-cookie';\n            case 3:\n                return 'seT-cookie';\n            case 4:\n                return 'set-Cookie';\n            case 5:\n                return 'set-cOokie';\n            case 6:\n                return 'set-coOkie';\n            case 7:\n                return 'set-cooKie';\n            case 8:\n                return 'set-cookIe';\n            case 9:\n                return 'set-cookiE';\n            case 10:\n                return 'SEt-cookie';\n            case 11:\n                return 'SET-cookie';\n            case 12:\n                return 'SEt-Cookie';\n            case 13:\n                return 'SEt-cOokie';\n            case 14:\n                return 'SEt-coOkie';\n            case 15:\n                return 'SEt-cooKie';\n            case 16:\n                return 'SEt-cookIe';\n            case 17:\n                return 'SEt-cookiE';\n            default:\n                return 'Set-Cookie';\n        }\n    }\n\n    /**\n     * Normalize the given header name into studly-case.\n     *\n     * @param  string  $name\n     * @return string\n     */\n    protected function normalizeHeaderName($name)\n    {\n        return str_replace(' ', '-', ucwords(str_replace('-', ' ', $name)));\n    }\n}\n"
  },
  {
    "path": "src/Runtime/LambdaRuntime.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Exception;\nuse Throwable;\n\nclass LambdaRuntime\n{\n    use NotifiesLambda;\n\n    /**\n     * The Lambda API URL.\n     *\n     * @var string\n     */\n    protected $apiUrl;\n\n    /**\n     * Create a new Lambda runtime.\n     *\n     * @param  string  $apiUrl\n     * @return void\n     */\n    public function __construct($apiUrl)\n    {\n        $this->apiUrl = $apiUrl;\n    }\n\n    /**\n     * Create new Lambda runtime from the API environment variable.\n     *\n     * @return static\n     */\n    public static function fromEnvironmentVariable()\n    {\n        return new static(getenv('AWS_LAMBDA_RUNTIME_API'));\n    }\n\n    /**\n     * Handle the next Lambda invocation.\n     *\n     * @return void\n     */\n    public function nextInvocation(callable $callback)\n    {\n        [$invocationId, $event] = LambdaInvocation::next($this->apiUrl);\n\n        $_ENV['AWS_REQUEST_ID'] = $invocationId;\n\n        try {\n            $this->notifyLambdaOfResponse($invocationId, $callback($invocationId, $event));\n        } catch (Throwable $error) {\n            $this->handleException($invocationId, $error);\n\n            exit(1);\n        }\n    }\n\n    /**\n     * Inform Lambda of an invocation failure.\n     *\n     * @return void\n     */\n    public function handleException(string $invocationId, Throwable $error)\n    {\n        $errorMessage = $error instanceof Exception\n                    ? 'Uncaught '.get_class($error).': '.$error->getMessage()\n                    : $error->getMessage();\n\n        function_exists('__vapor_debug') && __vapor_debug(sprintf(\n            \"Fatal error: %s in %s:%d\\nStack trace:\\n%s\",\n            $errorMessage,\n            $error->getFile(),\n            $error->getLine(),\n            $error->getTraceAsString()\n        ));\n\n        $this->notifyLambdaOfError($invocationId, [\n            'errorMessage' => $error->getMessage(),\n            'errorType' => get_class($error),\n            'stackTrace' => explode(PHP_EOL, $error->getTraceAsString()),\n        ]);\n    }\n}\n"
  },
  {
    "path": "src/Runtime/LoadBalancedLambdaResponse.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Symfony\\Component\\HttpFoundation\\Response as SymfonyResponse;\n\nclass LoadBalancedLambdaResponse extends LambdaResponse\n{\n    /**\n     * Convert the response to Load Balancer's supported format.\n     *\n     * @return array\n     */\n    public function toApiGatewayFormat()\n    {\n        $requiresEncoding = isset($this->headers['x-vapor-base64-encode'][0]);\n\n        return [\n            'isBase64Encoded' => $requiresEncoding,\n            'statusCode' => $this->status,\n            'statusDescription' => $this->status.' '.$this->statusText($this->status),\n            'multiValueHeaders' => empty($this->headers) ? [] : $this->prepareHeaders($this->headers),\n            'body' => $requiresEncoding ? base64_encode($this->body) : $this->body,\n        ];\n    }\n\n    /**\n     * Get the status text for the given status code.\n     *\n     * @param  int  $status\n     * @return string\n     */\n    public function statusText($status)\n    {\n        $statusTexts = SymfonyResponse::$statusTexts;\n\n        $statusTexts[419] = 'Authentication Timeout';\n\n        return $statusTexts[$status];\n    }\n\n    /**\n     * Prepare the given response headers.\n     *\n     * @param  array  $responseHeaders\n     * @return array\n     */\n    protected function prepareHeaders(array $responseHeaders)\n    {\n        $headers = [];\n\n        foreach ($responseHeaders as $name => $values) {\n            $headers[static::normalizeHeaderName($name)] = static::normalizeHeaderValues($values);\n        }\n\n        if (! isset($headers['Content-Type']) || empty($headers['Content-Type'])) {\n            $headers['Content-Type'] = ['text/html'];\n        }\n\n        return $headers;\n    }\n\n    /**\n     * Normalize the given header values into strings.\n     *\n     * @param  array  $values\n     * @return array\n     */\n    protected function normalizeHeaderValues($values)\n    {\n        return array_map(function ($value) {\n            return (string) $value;\n        }, $values);\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Logger.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Monolog\\Formatter\\JsonFormatter;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Logger as MonologLogger;\n\nclass Logger\n{\n    /**\n     * The logger instance.\n     *\n     * @var \\Monolog\\Logger\n     */\n    protected static $logger;\n\n    /**\n     * Write general information to the log.\n     *\n     * @param  string  $message\n     * @param  array  $context\n     * @return void\n     */\n    public static function info($message, array $context = [])\n    {\n        static::ensureLoggerIsAvailable();\n\n        static::$logger->info($message, $context);\n    }\n\n    /**\n     * Write error information to the log.\n     *\n     * @param  string  $message\n     * @param  array  $context\n     * @return void\n     */\n    public static function error($message, array $context = [])\n    {\n        static::ensureLoggerIsAvailable();\n\n        static::$logger->error($message, $context);\n    }\n\n    /**\n     * Ensure the logger has been instantiated.\n     *\n     * @return void\n     */\n    protected static function ensureLoggerIsAvailable()\n    {\n        if (isset(static::$logger)) {\n            return;\n        }\n\n        static::$logger = new MonologLogger('vapor', [\n            (new StreamHandler('php://stderr'))->setFormatter(new JsonFormatter),\n        ]);\n    }\n}\n"
  },
  {
    "path": "src/Runtime/NotifiesLambda.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Exception;\n\ntrait NotifiesLambda\n{\n    /**\n     * Send the response data to Lambda.\n     *\n     * @param  string  $invocationId\n     * @param  mixed  $data\n     * @return void\n     */\n    protected function notifyLambdaOfResponse($invocationId, $data)\n    {\n        return $this->lambdaRequest(\n            \"http://{$this->apiUrl}/2018-06-01/runtime/invocation/{$invocationId}/response\", $data\n        );\n    }\n\n    /**\n     * Send the error response data to Lambda.\n     *\n     * @param  string  $invocationId\n     * @param  mixed  $data\n     * @return void\n     */\n    protected function notifyLambdaOfError($invocationId, $data)\n    {\n        return $this->lambdaRequest(\n            \"http://{$this->apiUrl}/2018-06-01/runtime/invocation/{$invocationId}/error\", $data\n        );\n    }\n\n    /**\n     * Send the given data to the given URL as JSON.\n     *\n     * @param  string  $url\n     * @param  mixed  $data\n     * @return void\n     */\n    protected function lambdaRequest($url, $data)\n    {\n        $json = json_encode($data);\n\n        if ($json === false) {\n            throw new Exception('Error encoding runtime JSON response: '.json_last_error_msg());\n        }\n\n        $handler = curl_init($url);\n\n        curl_setopt($handler, CURLOPT_CUSTOMREQUEST, 'POST');\n        curl_setopt($handler, CURLOPT_RETURNTRANSFER, true);\n        curl_setopt($handler, CURLOPT_POSTFIELDS, $json);\n\n        curl_setopt($handler, CURLOPT_HTTPHEADER, [\n            'Content-Type: application/json',\n            'Content-Length: '.strlen($json),\n        ]);\n\n        curl_exec($handler);\n\n        if (curl_error($handler)) {\n            $errorMessage = curl_error($handler);\n\n            throw new Exception('Error calling the runtime API: '.$errorMessage);\n        }\n\n        curl_setopt($handler, CURLOPT_HEADERFUNCTION, null);\n        curl_setopt($handler, CURLOPT_READFUNCTION, null);\n        curl_setopt($handler, CURLOPT_WRITEFUNCTION, null);\n        curl_setopt($handler, CURLOPT_PROGRESSFUNCTION, null);\n\n        curl_reset($handler);\n\n        if (PHP_VERSION_ID >= 80000) {\n            unset($handler);\n        } else {\n            curl_close($handler);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Octane/Octane.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Octane;\n\nuse Illuminate\\Contracts\\Debug\\ExceptionHandler;\nuse Illuminate\\Database\\MySqlConnection;\nuse Illuminate\\Foundation\\Application;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Pipeline\\Pipeline;\nuse Laravel\\Octane\\ApplicationFactory;\nuse Laravel\\Octane\\Contracts\\Client;\nuse Laravel\\Octane\\MarshalsPsr7RequestsAndResponses;\nuse Laravel\\Octane\\OctaneResponse;\nuse Laravel\\Octane\\RequestContext;\nuse Laravel\\Octane\\Worker;\nuse Laravel\\Vapor\\Runtime\\Http\\Middleware\\EnsureBinaryEncoding;\nuse Laravel\\Vapor\\Runtime\\Http\\Middleware\\EnsureOnNakedDomain;\nuse Laravel\\Vapor\\Runtime\\Http\\Middleware\\EnsureVanityUrlIsNotIndexed;\nuse Laravel\\Vapor\\Runtime\\Http\\Middleware\\RedirectStaticAssets;\nuse Laravel\\Vapor\\Runtime\\HttpKernel;\nuse Laravel\\Vapor\\Runtime\\Response;\nuse Laravel\\Vapor\\Runtime\\StorageDirectories;\nuse PDO;\nuse Symfony\\Component\\HttpFoundation\\BinaryFileResponse;\nuse Symfony\\Component\\HttpFoundation\\StreamedResponse;\nuse Throwable;\n\nclass Octane implements Client\n{\n    use MarshalsPsr7RequestsAndResponses;\n\n    /**\n     * The default database session time-to-live.\n     */\n    const DB_SESSION_DEFAULT_TTL = 28800;\n\n    /**\n     * List of Octane database sessions.\n     *\n     * @var bool\n     */\n    protected static $databaseSessions = [\n        // ..\n    ];\n\n    /**\n     * The Octane response, if any.\n     *\n     * @var \\Laravel\\Octane\\OctaneResponse|null\n     */\n    protected static $response;\n\n    /**\n     * The Octane worker, if any.\n     *\n     * @var \\Laravel\\Octane\\Worker|null\n     */\n    protected static $worker;\n\n    /**\n     * Boots an Octane worker instance.\n     *\n     * @param  string  $basePath\n     * @param  bool  $databaseSessionPersist\n     * @param  int  $databaseSessionTtl\n     * @return void\n     */\n    public static function boot($basePath, $databaseSessionPersist = false, $databaseSessionTtl = 0)\n    {\n        self::ensureServerSoftware('vapor');\n\n        $databaseSessionTtl = (int) $databaseSessionTtl;\n\n        static::$worker = tap(new Worker(\n            new ApplicationFactory($basePath), new self)\n        )->boot()->onRequestHandled(static::manageDatabaseSessions($databaseSessionPersist, $databaseSessionTtl));\n\n        if ($databaseSessionPersist && $databaseSessionTtl > 0) {\n            static::worker()->application()->make('db')->beforeExecuting(function ($query, $bindings, $connection) {\n                if ($connection instanceof MySqlConnection && ! in_array($connection->getName(), static::$databaseSessions)) {\n                    static::$databaseSessions[] = $connection->getName();\n\n                    $connection->unprepared(sprintf(\n                        'SET SESSION wait_timeout=%s', static::DB_SESSION_DEFAULT_TTL\n                    ));\n                }\n            });\n        }\n    }\n\n    /**\n     * Manage the database sessions.\n     *\n     * @param  bool  $databaseSessionPersist\n     * @param  int  $databaseSessionTtl\n     * @return callable\n     */\n    protected static function manageDatabaseSessions($databaseSessionPersist, $databaseSessionTtl)\n    {\n        return function ($request, $response, $sandbox) use ($databaseSessionPersist, $databaseSessionTtl) {\n            if (! $sandbox->resolved('db') || ($databaseSessionPersist && $databaseSessionTtl == 0)) {\n                return;\n            }\n\n            $connections = collect($sandbox->make('db')->getConnections());\n\n            if (! $databaseSessionPersist) {\n                return $connections->each->disconnect();\n            }\n\n            $connections->filter(function ($connection) {\n                $hasSession = in_array($connection->getName(), static::$databaseSessions);\n\n                if (! $hasSession) {\n                    try {\n                        $connection->disconnect();\n                    } catch (Throwable $e) {\n                        // Likely already disconnected...\n                    }\n                }\n\n                return $hasSession;\n            })->map->getRawPdo()->filter(function ($pdo) {\n                return $pdo instanceof PDO;\n            })->each(function ($pdo) use ($databaseSessionTtl) {\n                try {\n                    $pdo->exec(sprintf(\n                        'SET SESSION wait_timeout=%s', $databaseSessionTtl\n                    ));\n                } catch (Throwable $e) {\n                    // Connection already gone away, safe to ignore...\n                }\n            });\n        };\n    }\n\n    /**\n     * Handle the given Octane request.\n     *\n     * @param  \\Laravel\\Octane\\RequestContext  $request\n     * @return \\Laravel\\Vapor\\Runtime\\Response\n     */\n    public static function handle($request)\n    {\n        [$request, $context] = (new self)->marshalRequest($request);\n\n        static::$databaseSessions = [];\n\n        self::worker()->application()->useStoragePath(StorageDirectories::PATH);\n\n        if (HttpKernel::shouldSendMaintenanceModeResponse($request)) {\n            if (isset($_ENV['VAPOR_MAINTENANCE_MODE_SECRET']) &&\n                $_ENV['VAPOR_MAINTENANCE_MODE_SECRET'] == $request->path()) {\n                $response = HttpKernel::bypassResponse($_ENV['VAPOR_MAINTENANCE_MODE_SECRET']);\n            } elseif (isset($_ENV['VAPOR_MAINTENANCE_MODE_SECRET']) &&\n                static::hasValidBypassCookie($request, $_ENV['VAPOR_MAINTENANCE_MODE_SECRET'])) {\n                $response = static::sendRequest($request, $context);\n            } elseif ($request->wantsJson() && file_exists($_ENV['LAMBDA_TASK_ROOT'].'/503.json')) {\n                $response = JsonResponse::fromJsonString(\n                    file_get_contents($_ENV['LAMBDA_TASK_ROOT'].'/503.json'), 503\n                );\n            } else {\n                $response = new \\Illuminate\\Http\\Response(\n                    file_get_contents($_ENV['LAMBDA_TASK_ROOT'].'/503.html'), 503\n                );\n            }\n        } else {\n            $response = static::sendRequest($request, $context);\n        }\n\n        $content = $response instanceof BinaryFileResponse\n            ? $response->getFile()->getContent()\n            : $response->getContent();\n\n        if ($response instanceof StreamedResponse) {\n            $content = static::captureContent($response);\n        }\n\n        return tap(new Response(\n            $content,\n            $response->headers->all(),\n            $response->getStatusCode()\n        ), static function () {\n            static::$response = null;\n        });\n    }\n\n    /**\n     * Send the request to the worker.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  \\Laravel\\Octane\\RequestContext  $context\n     * @return \\Laravel\\Octane\\OctaneResponse\n     */\n    protected static function sendRequest($request, $context)\n    {\n        return (new Pipeline)->send($request)\n            ->through([\n                new EnsureOnNakedDomain,\n                new RedirectStaticAssets,\n                new EnsureVanityUrlIsNotIndexed,\n                new EnsureBinaryEncoding(),\n            ])->then(function ($request) use ($context) {\n                static::$worker->handle($request, $context);\n\n                return static::$response->response;\n            });\n    }\n\n    /**\n     * Determine if the incoming request has a maintenance mode bypass cookie.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  string  $secret\n     * @return bool\n     */\n    public static function hasValidBypassCookie($request, $secret)\n    {\n        return HttpKernel::hasValidBypassCookie($request, $secret);\n    }\n\n    /**\n     * Terminates an Octane worker instance, if any.\n     *\n     * @return void\n     */\n    public static function terminate()\n    {\n        if (static::$worker) {\n            static::$worker->terminate();\n\n            static::$worker = null;\n\n            self::ensureServerSoftware(null);\n        }\n    }\n\n    /**\n     * Marshal the given Octane request context into an Laravel foundation request.\n     */\n    public function marshalRequest(RequestContext $context): array\n    {\n        return [\n            static::toHttpFoundationRequest($context->psr7Request),\n            $context,\n        ];\n    }\n\n    /**\n     * Stores the response in the instance.\n     */\n    public function respond(RequestContext $context, OctaneResponse $response): void\n    {\n        static::$response = $response;\n    }\n\n    /**\n     * Send an error message to the server.\n     */\n    public function error(Throwable $e, Application $app, Request $request, RequestContext $context): void\n    {\n        try {\n            static::$response = new OctaneResponse(\n                $app[ExceptionHandler::class]->render($request, $e)\n            );\n        } catch (Throwable $throwable) {\n            function_exists('__vapor_debug') && __vapor_debug($throwable->getMessage());\n            function_exists('__vapor_debug') && __vapor_debug($e->getMessage());\n\n            static::$response = new OctaneResponse(\n                new \\Illuminate\\Http\\Response('', 500)\n            );\n        }\n    }\n\n    /**\n     * Ensures the given software name is set globally.\n     *\n     * @param  string|null  $software\n     * @return void\n     */\n    protected static function ensureServerSoftware($software)\n    {\n        $_ENV['SERVER_SOFTWARE'] = $software;\n        $_SERVER['SERVER_SOFTWARE'] = $software;\n    }\n\n    /**\n     * Get the Octane worker, if any.\n     *\n     * @return \\Laravel\\Octane\\Worker|null\n     */\n    public static function worker()\n    {\n        return static::$worker;\n    }\n\n    /**\n     * Capture the content from a streamed response.\n     */\n    protected static function captureContent(StreamedResponse $response): string\n    {\n        ob_start();\n        $response->sendContent();\n        $content = ob_get_contents();\n        ob_end_clean();\n\n        return $content;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Octane/OctaneHttpHandlerFactory.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Octane;\n\nuse Laravel\\Vapor\\Runtime\\Handlers\\LoadBalancedOctaneHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\OctaneHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\PayloadFormatVersion2OctaneHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\UnknownEventHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\WarmerHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\WarmerPingHandler;\n\nclass OctaneHttpHandlerFactory\n{\n    /**\n     * Create a new handler for the given HTTP event.\n     *\n     * @param  array  $event\n     * @return \\Laravel\\Vapor\\Contracts\\LambdaEventHandler\n     */\n    public static function make(array $event)\n    {\n        if (isset($event['vaporWarmer'])) {\n            return new WarmerHandler;\n        } elseif (isset($event['vaporWarmerPing'])) {\n            return new WarmerPingHandler;\n        } elseif (isset($event['requestContext']['elb'])) {\n            return new LoadBalancedOctaneHandler;\n        } elseif (isset($event['version']) && $event['version'] === '2.0') {\n            return new PayloadFormatVersion2OctaneHandler;\n        } elseif (isset($event['httpMethod']) || isset($event['requestContext']['http']['method'])) {\n            return new OctaneHandler;\n        }\n\n        return new UnknownEventHandler;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Octane/OctaneRequestContextFactory.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime\\Octane;\n\nuse Illuminate\\Support\\Arr as SupportArr;\nuse Illuminate\\Support\\Collection;\nuse Illuminate\\Support\\Str;\nuse Laravel\\Octane\\RequestContext;\nuse Laravel\\Vapor\\Arr;\nuse Laravel\\Vapor\\Runtime\\Request;\nuse Nyholm\\Psr7\\ServerRequest;\nuse Nyholm\\Psr7\\UploadedFile;\nuse Riverline\\MultiPartParser\\Part;\n\nclass OctaneRequestContextFactory\n{\n    /**\n     * Creates an Octane request context from the given event.\n     *\n     * @param  array  $event\n     * @param  array  $serverVariables\n     * @return \\Laravel\\Octane\\RequestContext\n     */\n    public static function fromEvent($event, $serverVariables)\n    {\n        $request = Request::fromLambdaEvent($event, $serverVariables);\n\n        $method = $request->serverVariables['REQUEST_METHOD'];\n\n        $contentType = array_change_key_case($request->headers)['content-type'] ?? null;\n\n        $serverRequest = new ServerRequest(\n            $request->serverVariables['REQUEST_METHOD'],\n            static::parseUri($request->serverVariables['REQUEST_URI']),\n            $request->headers,\n            $request->body,\n            $request->serverVariables['SERVER_PROTOCOL'],\n            $request->serverVariables\n        );\n\n        $serverRequest = $serverRequest->withCookieParams(static::cookies($event, $request->headers));\n\n        $serverRequest = $serverRequest->withUploadedFiles(static::uploadedFiles(\n            $method, $contentType, $request->body\n        ));\n\n        $serverRequest = $serverRequest->withParsedBody(static::parsedBody(\n            $method, $contentType, $request->body\n        ));\n\n        parse_str($request->serverVariables['QUERY_STRING'], $queryParams);\n\n        $serverRequest = $serverRequest->withQueryParams($queryParams);\n\n        return new RequestContext([\n            'psr7Request' => $serverRequest,\n        ]);\n    }\n\n    /**\n     * Get the cookies from the given headers.\n     *\n     * @param  array  $event\n     * @param  array  $headers\n     * @return array\n     */\n    protected static function cookies($event, $headers)\n    {\n        if (isset($event['version']) && $event['version'] === '2.0') {\n            $cookies = $event['cookies'] ?? [];\n        } else {\n            $headers = array_change_key_case($headers);\n\n            $cookies = isset($headers['cookie']) ? explode('; ', $headers['cookie']) : [];\n        }\n\n        if (empty($cookies)) {\n            return [];\n        }\n\n        return Collection::make($cookies)->mapWithKeys(function ($cookie) {\n            $cookie = explode('=', trim($cookie), 2);\n\n            $key = $cookie[0];\n\n            if (! isset($cookie[1])) {\n                return [$key => null];\n            }\n\n            return [$key => urldecode($cookie[1])];\n        })->filter()->all();\n    }\n\n    /**\n     * Create a new file instance from the given HTTP request document part.\n     *\n     * @param  \\Riverline\\MultipartParser\\Part  $part\n     * @return \\Psr\\Http\\Message\\UploadedFileInterface\n     */\n    protected static function createFile($part)\n    {\n        file_put_contents(\n            $path = tempnam(sys_get_temp_dir(), 'vapor_upload_'),\n            $part->getBody()\n        );\n\n        return new UploadedFile(\n            $path,\n            filesize($path),\n            UPLOAD_ERR_OK,\n            $part->getFileName(),\n            $part->getMimeType()\n        );\n    }\n\n    /**\n     * Parse the files for the given HTTP request body.\n     *\n     * @param  string  $contentType\n     * @param  string  $body\n     * @return array\n     */\n    protected static function parseFiles($contentType, $body)\n    {\n        $document = new Part(\"Content-Type: $contentType\\r\\n\\r\\n\".$body);\n\n        if (! $document->isMultiPart()) {\n            return [];\n        }\n\n        return Collection::make($document->getParts())\n            ->filter\n            ->isFile()\n            ->reduce(function ($files, $part) {\n                return Str::contains($name = $part->getName(), '[')\n                    ? Arr::setMultiPartArrayValue($files, $name, static::createFile($part))\n                    : SupportArr::set($files, $name, static::createFile($part));\n            }, []);\n    }\n\n    /**\n     * Get the uploaded files for the incoming event.\n     *\n     * @param  string  $method\n     * @param  string  $contentType\n     * @param  string  $body\n     * @return array\n     */\n    protected static function uploadedFiles($method, $contentType, $body)\n    {\n        if (! in_array($method, ['POST', 'PUT']) ||\n            is_null($contentType) ||\n            static::isUrlEncodedForm($contentType)) {\n            return [];\n        }\n\n        return static::parseFiles($contentType, $body);\n    }\n\n    /**\n     * Get the parsed body for the event.\n     *\n     * @param  string  $method\n     * @param  string  $contentType\n     * @param  string  $body\n     * @return array|null\n     */\n    protected static function parsedBody($method, $contentType, $body)\n    {\n        if (! in_array($method, ['POST', 'PUT']) || is_null($contentType)) {\n            return;\n        }\n\n        if (static::isUrlEncodedForm($contentType)) {\n            parse_str($body, $parsedBody);\n\n            return $parsedBody;\n        }\n\n        return static::parseBody($contentType, $body);\n    }\n\n    /**\n     * Parse the incoming event's request body.\n     *\n     * @param  string  $contentType\n     * @param  string  $body\n     * @return array\n     */\n    protected static function parseBody($contentType, $body)\n    {\n        $document = new Part(\"Content-Type: $contentType\\r\\n\\r\\n\".$body);\n\n        if (! $document->isMultiPart()) {\n            return;\n        }\n\n        return Collection::make($document->getParts())\n            ->reject\n            ->isFile()\n            ->reduce(function ($parsedBody, $part) {\n                return Str::contains($name = $part->getName(), '[')\n                    ? Arr::setMultiPartArrayValue($parsedBody, $name, $part->getBody())\n                    : SupportArr::set($parsedBody, $name, $part->getBody());\n            }, []);\n    }\n\n    /**\n     * Parse the incoming event's request uri.\n     *\n     * @param  string  $uri\n     * @return string\n     */\n    protected static function parseUri($uri)\n    {\n        if (parse_url($uri) === false) {\n            return '/';\n        }\n\n        return $uri;\n    }\n\n    /**\n     * Determine if the given content type represents a URL encoded form.\n     *\n     * @param  string  $contentType\n     * @return bool\n     */\n    protected static function isUrlEncodedForm($contentType)\n    {\n        return Str::contains(strtolower($contentType), 'application/x-www-form-urlencoded');\n    }\n}\n"
  },
  {
    "path": "src/Runtime/PayloadFormatVersion2LambdaResponse.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Laravel\\Vapor\\Contracts\\LambdaResponse as LambdaResponseContract;\nuse stdClass;\n\nclass PayloadFormatVersion2LambdaResponse extends LambdaResponse implements LambdaResponseContract\n{\n    /**\n     * Convert the response to API Gateway's supported format.\n     *\n     * @return array\n     */\n    public function toApiGatewayFormat()\n    {\n        $requiresEncoding = isset($this->headers['x-vapor-base64-encode'][0]);\n\n        return [\n            'isBase64Encoded' => $requiresEncoding,\n            'statusCode' => $this->status,\n            'cookies' => isset($this->headers['set-cookie']) ? $this->headers['set-cookie'] : [],\n            'headers' => empty($this->headers) ? new stdClass : $this->prepareHeaders($this->headers),\n            'body' => $requiresEncoding ? base64_encode($this->body) : $this->body,\n        ];\n    }\n\n    /**\n     * Prepare the given response headers for API Gateway.\n     *\n     * @param  array  $responseHeaders\n     * @return array\n     */\n    protected function prepareHeaders(array $responseHeaders)\n    {\n        $headers = [];\n\n        foreach ($responseHeaders as $name => $values) {\n            $name = $this->normalizeHeaderName($name);\n\n            if ($name == 'Set-Cookie') {\n                continue;\n            }\n\n            foreach ($values as $value) {\n                $headers[$name] = $value;\n            }\n        }\n\n        if (! isset($headers['Content-Type'])) {\n            $headers['Content-Type'] = 'text/html';\n        }\n\n        return $headers;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Request.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Illuminate\\Support\\Arr;\n\nclass Request\n{\n    /**\n     * The request server variables.\n     *\n     * @var array\n     */\n    public $serverVariables;\n\n    /**\n     * The request body.\n     *\n     * @var string\n     */\n    public $body;\n\n    /**\n     * The request headers.\n     *\n     * @var array\n     */\n    public $headers;\n\n    /**\n     * Create a new request instance.\n     *\n     * @param  array  $serverVariables\n     * @param  string  $body\n     * @param  array  $headers\n     * @return void\n     */\n    public function __construct(array $serverVariables, $body, $headers)\n    {\n        $this->body = $body;\n        $this->serverVariables = $serverVariables;\n        $this->headers = $headers;\n    }\n\n    /**\n     * Create a new request from the given Lambda event.\n     *\n     * @param  array  $event\n     * @param  array  $serverVariables\n     * @param  string|null  $handler\n     * @return static\n     */\n    public static function fromLambdaEvent(array $event, array $serverVariables = [], $handler = null)\n    {\n        [$uri, $queryString] = static::getUriAndQueryString($event);\n\n        $headers = static::getHeaders($event);\n\n        $requestBody = static::getRequestBody($event);\n\n        $serverVariables = array_merge($serverVariables, [\n            'GATEWAY_INTERFACE' => 'FastCGI/1.0',\n            'PATH_INFO' => $event['path'] ?? $event['requestContext']['http']['path'] ?? '/',\n            'QUERY_STRING' => $queryString,\n            'REMOTE_ADDR' => '127.0.0.1',\n            'REMOTE_PORT' => $headers['x-forwarded-port'] ?? 80,\n            'REQUEST_METHOD' => $event['httpMethod'] ?? $event['requestContext']['http']['method'],\n            'REQUEST_URI' => $uri,\n            'REQUEST_TIME' => time(),\n            'REQUEST_TIME_FLOAT' => microtime(true),\n            'SERVER_ADDR' => '127.0.0.1',\n            'SERVER_NAME' => $headers['host'] ?? 'localhost',\n            'SERVER_PORT' => $headers['x-forwarded-port'] ?? 80,\n            'SERVER_PROTOCOL' => $event['requestContext']['protocol'] ?? $event['requestContext']['http']['protocol'] ?? 'HTTP/1.1',\n            'SERVER_SOFTWARE' => 'vapor',\n        ]);\n\n        if ($handler) {\n            $serverVariables['SCRIPT_FILENAME'] = $handler;\n        }\n\n        if ($timestamp = self::extractRequestTimestamp($event)) {\n            $serverVariables['AWS_API_GATEWAY_REQUEST_TIME'] = $timestamp;\n        }\n\n        [$headers, $serverVariables] = static::ensureContentTypeIsSet(\n            $event, $headers, $serverVariables\n        );\n\n        [$headers, $serverVariables] = static::ensureContentLengthIsSet(\n            $event, $headers, $serverVariables, $requestBody\n        );\n\n        $headers = static::ensureSourceIpAddressIsSet(\n            $event, $headers\n        );\n\n        foreach ($headers as $header => $value) {\n            $serverVariables['HTTP_'.strtoupper(str_replace('-', '_', $header))] = $value;\n        }\n\n        return new static($serverVariables, $requestBody, $headers);\n    }\n\n    /**\n     * Get the URI and query string for the given event.\n     *\n     * @param  array  $event\n     * @return array\n     */\n    protected static function getUriAndQueryString(array $event)\n    {\n        $uri = $event['requestContext']['http']['path'] ?? $event['path'] ?? '/';\n\n        $queryString = self::getQueryString($event);\n\n        parse_str($queryString, $queryParameters);\n\n        return [\n            empty($queryString) ? $uri : $uri.'?'.$queryString,\n            http_build_query($queryParameters),\n        ];\n    }\n\n    /**\n     * Get the query string from the event.\n     *\n     * @param  array  $event\n     * @return string\n     */\n    protected static function getQueryString(array $event)\n    {\n        if (isset($event['version']) && $event['version'] === '2.0') {\n            return http_build_query(\n                collect($event['queryStringParameters'] ?? [])\n                ->mapWithKeys(function ($value, $key) {\n                    $values = explode(',', $value);\n\n                    return count($values) === 1\n                        ? [$key => $values[0]]\n                        : [(substr($key, -2) == '[]' ? substr($key, 0, -2) : $key) => $values];\n                })->all()\n            );\n        }\n\n        if (! isset($event['multiValueQueryStringParameters'])) {\n            return http_build_query(\n                $event['queryStringParameters'] ?? []\n            );\n        }\n\n        return http_build_query(\n            collect($event['multiValueQueryStringParameters'] ?? [])\n                ->mapWithKeys(function ($values, $key) use ($event) {\n                    $key = ! isset($event['requestContext']['elb']) ? $key : urldecode($key);\n\n                    return count($values) === 1\n                        ? [$key => $values[0]]\n                        : [(substr($key, -2) == '[]' ? substr($key, 0, -2) : $key) => $values];\n                })->map(function ($values) use ($event) {\n                    if (! isset($event['requestContext']['elb'])) {\n                        return $values;\n                    }\n\n                    return ! is_array($values) ? urldecode($values) : array_map(function ($value) {\n                        return urldecode($value);\n                    }, $values);\n                })->all()\n        );\n    }\n\n    /**\n     * Get the request headers from the event.\n     *\n     * @param  array  $event\n     * @return array\n     */\n    protected static function getHeaders(array $event)\n    {\n        if (! isset($event['multiValueHeaders'])) {\n            return array_change_key_case(\n                $event['headers'] ?? [], CASE_LOWER\n            );\n        }\n\n        return array_change_key_case(\n            collect($event['multiValueHeaders'] ?? [])\n                ->mapWithKeys(function ($headers, $name) {\n                    return [$name => Arr::last($headers)];\n                })->all(), CASE_LOWER\n        );\n    }\n\n    /**\n     * Get the request body from the event.\n     *\n     * @param  array  $event\n     * @return string\n     */\n    protected static function getRequestBody(array $event)\n    {\n        $body = $event['body'] ?? '';\n\n        return isset($event['isBase64Encoded']) && $event['isBase64Encoded']\n            ? base64_decode($body)\n            : $body;\n    }\n\n    /**\n     * Ensure the request headers / server variables contain a content type.\n     *\n     * @param  array  $event\n     * @param  array  $headers\n     * @param  array  $serverVariables\n     * @return array\n     */\n    protected static function ensureContentTypeIsSet(array $event, array $headers, array $serverVariables)\n    {\n        if ((! isset($headers['content-type']) && isset($event['httpMethod']) && (strtoupper($event['httpMethod']) === 'POST')) ||\n            (! isset($headers['content-type']) && isset($event['requestContext']['http']['method']) && (strtoupper($event['requestContext']['http']['method']) === 'POST'))) {\n            $headers['content-type'] = 'application/x-www-form-urlencoded';\n        }\n\n        if (isset($headers['content-type'])) {\n            $serverVariables['CONTENT_TYPE'] = $headers['content-type'];\n        }\n\n        return [$headers, $serverVariables];\n    }\n\n    /**\n     * Ensure the request headers / server variables contain a content length.\n     *\n     * @param  array  $event\n     * @param  array  $headers\n     * @param  array  $serverVariables\n     * @param  string  $requestBody\n     * @return array\n     */\n    protected static function ensureContentLengthIsSet(array $event, array $headers, array $serverVariables, $requestBody)\n    {\n        if ((! isset($headers['content-length']) && isset($event['httpMethod']) && ! in_array(strtoupper($event['httpMethod']), ['TRACE'])) ||\n            (! isset($headers['content-length']) && isset($event['requestContext']['http']['method']) && ! in_array(strtoupper($event['requestContext']['http']['method']), ['TRACE']))) {\n            $headers['content-length'] = strlen($requestBody);\n        }\n\n        if (isset($headers['content-length'])) {\n            $serverVariables['CONTENT_LENGTH'] = $headers['content-length'];\n        }\n\n        return [$headers, $serverVariables];\n    }\n\n    /**\n     * Ensure the request headers contain a source IP address.\n     *\n     * @param  array  $event\n     * @param  array  $headers\n     * @return array\n     */\n    protected static function ensureSourceIpAddressIsSet(array $event, array $headers)\n    {\n        if (isset($event['requestContext']['identity']['sourceIp'])) {\n            $headers['x-vapor-source-ip'] = $event['requestContext']['identity']['sourceIp'];\n        }\n\n        if (isset($event['requestContext']['http']['sourceIp'])) {\n            $headers['x-vapor-source-ip'] = $event['requestContext']['http']['sourceIp'];\n        }\n\n        return $headers;\n    }\n\n    /**\n     * Extracts the time (millisecond epoch) when the request was received by the API Gateway.\n     *\n     * @param  array  $event\n     * @return int|null\n     */\n    protected static function extractRequestTimestamp(array $event)\n    {\n        if (! isset($event['requestContext'])) {\n            return null;\n        }\n\n        return $event['requestContext']['requestTimeEpoch'] // REST API (V1)\n            ?? $event['requestContext']['timeEpoch']        // HTTP API (V2)\n            ?? null;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Response.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nclass Response\n{\n    /**\n     * The response status code.\n     *\n     * @var int\n     */\n    public $status;\n\n    /**\n     * The response headers.\n     *\n     * @var array\n     */\n    public $headers;\n\n    /**\n     * The response body.\n     *\n     * @var string\n     */\n    public $body;\n\n    /**\n     * Create a new response instance.\n     *\n     * @param  string  $body\n     * @param  array  $headers\n     * @param  int  $status\n     * @return void\n     */\n    public function __construct($body, $headers, $status)\n    {\n        $this->body = $body;\n        $this->status = $status;\n\n        $this->headers = $this->prepareHeaders($headers);\n    }\n\n    /**\n     * Prepare the given response headers.\n     *\n     * @param  array  $headers\n     * @return array\n     */\n    protected function prepareHeaders(array $headers)\n    {\n        $headers = array_change_key_case($headers, CASE_LOWER);\n\n        unset($headers['status']);\n\n        return $headers;\n    }\n}\n"
  },
  {
    "path": "src/Runtime/Secrets.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nuse Aws\\Ssm\\SsmClient;\n\nclass Secrets\n{\n    /**\n     * Add all of the secret parameters at the given path to the environment.\n     *\n     * @param  string  $path\n     * @param  array|null  $parameters\n     * @param  string  $file\n     * @return array\n     */\n    public static function addToEnvironment($path, $parameters, $file)\n    {\n        if (! $parameters && file_exists($file)) {\n            $parameters = require $file;\n        }\n\n        return tap(static::all($path, (array) $parameters), function ($variables) {\n            foreach ($variables as $key => $value) {\n                $_ENV[$key] = $value;\n                $_SERVER[$key] = $value;\n            }\n        });\n    }\n\n    /**\n     * Get all of the secret parameters (AWS SSM) at the given path.\n     *\n     * @param  string  $path\n     * @return array\n     */\n    public static function all($path, array $parameters = [])\n    {\n        if (empty($parameters)) {\n            return [];\n        }\n\n        $ssm = SsmClient::factory([\n            'region' => $_ENV['AWS_DEFAULT_REGION'],\n            'version' => 'latest',\n        ]);\n\n        return collect($parameters)->chunk(10)->reduce(function ($carry, $parameters) use ($ssm, $path) {\n            $ssmResponse = $ssm->getParameters([\n                'Names' => collect($parameters)->map(function ($version, $parameter) use ($path) {\n                    return $path.'/'.$parameter.':'.$version;\n                })->values()->all(),\n                'WithDecryption' => true,\n            ]);\n\n            return array_merge($carry, static::parseSecrets(\n                $ssmResponse['Parameters'] ?? []\n            ));\n        }, []);\n    }\n\n    /**\n     * Parse the secret names and values into an array.\n     *\n     * @return array\n     */\n    protected static function parseSecrets(array $secrets)\n    {\n        return collect($secrets)->mapWithKeys(function ($secret) {\n            $segments = explode('/', $secret['Name']);\n\n            return [$segments[count($segments) - 1] => $secret['Value']];\n        })->all();\n    }\n}\n"
  },
  {
    "path": "src/Runtime/StorageDirectories.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Runtime;\n\nclass StorageDirectories\n{\n    /**\n     * The storage path for the execution environment.\n     *\n     * @var string\n     */\n    public const PATH = '/tmp/storage';\n\n    /**\n     * Ensure the necessary storage directories exist.\n     *\n     * @return void\n     */\n    public static function create()\n    {\n        $directories = [\n            self::PATH.'/app',\n            self::PATH.'/logs',\n            self::PATH.'/bootstrap/cache',\n            self::PATH.'/framework/cache',\n            self::PATH.'/framework/views',\n        ];\n\n        foreach ($directories as $directory) {\n            if (! is_dir($directory)) {\n                function_exists('__vapor_debug') && __vapor_debug(\"Creating storage directory: $directory\");\n\n                mkdir($directory, 0755, true);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Vapor.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor;\n\nclass Vapor\n{\n    use HasAwsContext;\n\n    /**\n     * Determine whether the environment is Vapor.\n     */\n    public static function active(): bool\n    {\n        return env('VAPOR_SSM_PATH') !== null;\n    }\n\n    /**\n     * Determine whether the environment is not Vapor.\n     */\n    public static function inactive(): bool\n    {\n        return ! static::active();\n    }\n\n    /**\n     * Execute the callback if the environment is Vapor.\n     *\n     * @param  mixed  $whenActive\n     * @param  mixed  $whenInactive\n     * @return mixed\n     */\n    public static function whenActive($whenActive, $whenInactive = null)\n    {\n        if (static::active()) {\n            return value($whenActive);\n        }\n\n        return value($whenInactive);\n    }\n\n    /**\n     * Execute the callback if the environment is not Vapor.\n     *\n     * @param  mixed  $whenInactive\n     * @param  mixed  $whenActive\n     * @return mixed\n     */\n    public static function whenInactive($whenInactive, $whenActive = null)\n    {\n        return static::whenActive($whenActive, $whenInactive);\n    }\n}\n"
  },
  {
    "path": "src/VaporJobTimedOutException.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor;\n\nuse Exception;\nuse Throwable;\n\nclass VaporJobTimedOutException extends Exception\n{\n    /**\n     * Create a new exception instance.\n     *\n     * @param  string  $name\n     * @param  Throwable|null  $previous\n     */\n    public function __construct($name, ?Throwable $previous = null)\n    {\n        parent::__construct($name.' has timed out. It will be retried again.', 0, $previous);\n    }\n}\n"
  },
  {
    "path": "src/VaporServiceProvider.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor;\n\nuse Illuminate\\Contracts\\Console\\Kernel as ConsoleKernel;\nuse Illuminate\\Contracts\\Http\\Kernel as HttpKernel;\nuse Illuminate\\Support\\Facades\\Config;\nuse Illuminate\\Support\\Facades\\Queue;\nuse Illuminate\\Support\\Facades\\Schema;\nuse Illuminate\\Support\\ServiceProvider;\nuse InvalidArgumentException;\nuse Laravel\\Vapor\\Console\\Commands\\OctaneStatusCommand;\nuse Laravel\\Vapor\\Console\\Commands\\VaporHealthCheckCommand;\nuse Laravel\\Vapor\\Console\\Commands\\VaporQueueListFailedCommand;\nuse Laravel\\Vapor\\Console\\Commands\\VaporScheduleCommand;\nuse Laravel\\Vapor\\Console\\Commands\\VaporWorkCommand;\nuse Laravel\\Vapor\\Http\\Controllers\\SignedStorageUrlController;\nuse Laravel\\Vapor\\Http\\Middleware\\ServeStaticAssets;\nuse Laravel\\Vapor\\Queue\\VaporConnector;\n\nclass VaporServiceProvider extends ServiceProvider\n{\n    use ConfiguresAssets, ConfiguresDynamoDb, ConfiguresQueue, ConfiguresRedis, ConfiguresSqs, DefinesRoutes;\n\n    /**\n     * Bootstrap any application services.\n     *\n     * @return void\n     */\n    public function boot()\n    {\n        $this->ensureRoutesAreDefined();\n        $this->registerOctaneCommands();\n\n        if (($_ENV['VAPOR_SERVERLESS_DB'] ?? null) === 'true') {\n            Schema::defaultStringLength(191);\n        }\n\n        if ($this->app->resolved('queue')) {\n            call_user_func($this->queueExtender());\n        } else {\n            $this->app->afterResolving(\n                'queue', $this->queueExtender()\n            );\n        }\n    }\n\n    /**\n     * Get the queue extension callback.\n     *\n     * @return \\Closure\n     */\n    protected function queueExtender()\n    {\n        return function () {\n            Queue::extend('sqs', function () {\n                return new VaporConnector;\n            });\n        };\n    }\n\n    /**\n     * Register the service provider.\n     *\n     * @return void\n     */\n    public function register()\n    {\n        $this->app->singleton(\n            Contracts\\SignedStorageUrlController::class,\n            SignedStorageUrlController::class\n        );\n\n        $this->configure();\n        $this->offerPublishing();\n        $this->ensureAssetPathsAreConfigured();\n        $this->ensureRedisIsConfigured();\n        $this->ensureDynamoDbIsConfigured();\n        $this->ensureQueueIsConfigured();\n        $this->ensureSqsIsConfigured();\n        $this->ensureMixIsConfigured();\n        $this->configureTrustedProxy();\n\n        $this->registerMiddleware();\n        $this->registerCommands();\n    }\n\n    /**\n     * Setup the configuration for Horizon.\n     *\n     * @return void\n     */\n    protected function configure()\n    {\n        $this->mergeConfigFrom(\n            __DIR__.'/../config/vapor.php', 'vapor'\n        );\n    }\n\n    /**\n     * Setup the resource publishing groups for Horizon.\n     *\n     * @return void\n     */\n    protected function offerPublishing()\n    {\n        if ($this->app->runningInConsole()) {\n            $this->publishes([\n                __DIR__.'/../config/vapor.php' => config_path('vapor.php'),\n            ], 'vapor-config');\n        }\n    }\n\n    /**\n     * Ensure Laravel Mix is properly configured.\n     *\n     * @return void\n     */\n    protected function ensureMixIsConfigured()\n    {\n        if (isset($_ENV['MIX_URL'])) {\n            Config::set('app.mix_url', $_ENV['MIX_URL']);\n        }\n    }\n\n    /**\n     * Configure trusted proxy.\n     *\n     * @return void\n     */\n    private function configureTrustedProxy()\n    {\n        Config::set('trustedproxy.proxies', Config::get('trustedproxy.proxies') ?? ['0.0.0.0/0', '2000:0:0:0:0:0:0:0/3']);\n    }\n\n    /**\n     * Register the Vapor HTTP middleware.\n     *\n     * @return void\n     */\n    protected function registerMiddleware()\n    {\n        $this->app[HttpKernel::class]->pushMiddleware(ServeStaticAssets::class);\n    }\n\n    /**\n     * Register the Vapor console commands.\n     *\n     * @return void\n     *\n     * @throws \\InvalidArgumentException\n     */\n    protected function registerCommands()\n    {\n        if (! $this->app->runningInConsole()) {\n            return;\n        }\n\n        $this->app[ConsoleKernel::class]->command('vapor:handle {payload}', function () {\n            throw new InvalidArgumentException(\n                'Unknown event type. Please create a vapor:handle command to handle custom events.'\n            );\n        });\n\n        $this->app->singleton('command.vapor.work', function ($app) {\n            return new VaporWorkCommand($app['queue.vaporWorker']);\n        });\n\n        $this->app->singleton('command.vapor.queue-failed', function () {\n            return new VaporQueueListFailedCommand;\n        });\n\n        $this->app->singleton('command.vapor.health-check', function () {\n            return new VaporHealthCheckCommand;\n        });\n\n        $this->app->singleton('command.vapor.schedule', function () {\n            return new VaporScheduleCommand;\n        });\n\n        $this->commands(['command.vapor.work', 'command.vapor.queue-failed', 'command.vapor.health-check', 'command.vapor.schedule']);\n    }\n\n    /**\n     * Register the Vapor \"Octane\" console commands.\n     *\n     * @return void\n     *\n     * @throws \\InvalidArgumentException\n     */\n    protected function registerOctaneCommands()\n    {\n        // Ensure we are running on Vapor...\n        if (! isset($_ENV['VAPOR_SSM_PATH'])) {\n            return;\n        }\n\n        if ($this->app->runningInConsole()) {\n            $this->commands(OctaneStatusCommand::class);\n        }\n    }\n}\n"
  },
  {
    "path": "src/debug.php",
    "content": "<?php\n\nif (! function_exists('__vapor_debug')) {\n    function __vapor_debug($message)\n    {\n        if (isset($_ENV['VAPOR_DEBUG']) && $_ENV['VAPOR_DEBUG'] === 'true') {\n            fwrite(STDERR, $message.PHP_EOL);\n        }\n    }\n}\n"
  },
  {
    "path": "stubs/503.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n        <title>Service Unavailable</title>\n\n        <!-- Fonts -->\n        <link rel=\"dns-prefetch\" href=\"//fonts.gstatic.com\">\n        <link href=\"https://fonts.googleapis.com/css?family=Nunito\" rel=\"stylesheet\" type=\"text/css\">\n\n        <!-- Styles -->\n        <style>\n            html, body {\n                background-color: #fff;\n                color: #636b6f;\n                font-family: 'Nunito', sans-serif;\n                font-weight: 100;\n                height: 100vh;\n                margin: 0;\n            }\n\n            .full-height {\n                height: 100vh;\n            }\n\n            .flex-center {\n                align-items: center;\n                display: flex;\n                justify-content: center;\n            }\n\n            .position-ref {\n                position: relative;\n            }\n\n            .code {\n                border-right: 2px solid;\n                font-size: 26px;\n                padding: 0 15px 0 15px;\n                text-align: center;\n            }\n\n            .message {\n                font-size: 18px;\n                text-align: center;\n            }\n        </style>\n    </head>\n    <body>\n        <div class=\"flex-center position-ref full-height\">\n            <div class=\"code\">\n                503\n            </div>\n\n            <div class=\"message\" style=\"padding: 10px;\">\n                Service Unavailable\n            </div>\n        </div>\n    </body>\n</html>\n\n"
  },
  {
    "path": "stubs/cliRuntime.php",
    "content": "<?php\n\nuse Illuminate\\Contracts\\Console\\Kernel as ConsoleKernelContract;\nuse Laravel\\Vapor\\Runtime\\CliHandlerFactory;\nuse Laravel\\Vapor\\Runtime\\Environment;\nuse Laravel\\Vapor\\Runtime\\LambdaContainer;\nuse Laravel\\Vapor\\Runtime\\LambdaRuntime;\nuse Laravel\\Vapor\\Runtime\\Secrets;\nuse Laravel\\Vapor\\Runtime\\StorageDirectories;\n\n$app = require __DIR__.'/bootstrap/app.php';\n\n/*\n|--------------------------------------------------------------------------\n| Inject SSM Secrets Into Environment\n|--------------------------------------------------------------------------\n|\n| Next, we will inject any of the application's secrets stored in AWS\n| SSM into the environment variables. These variables may be a bit\n| larger than the variables allowed by Lambda which has a limit.\n|\n*/\n\nSecrets::addToEnvironment(\n    $_ENV['VAPOR_SSM_PATH'],\n    json_decode($_ENV['VAPOR_SSM_VARIABLES'] ?? '[]', true),\n    __DIR__.'/vaporSecrets.php'\n);\n\n/*\n|--------------------------------------------------------------------------\n| Inject Decrypted Environment Variables\n|--------------------------------------------------------------------------\n|\n| Next, we will check to see whether a decryption key has been set on the\n| environment. If so, we will attempt to discover an encrypted file at\n| the root of the application and decrypt it into the Vapor runtime.\n|\n*/\n\nEnvironment::decrypt($app);\n\n/*\n|--------------------------------------------------------------------------\n| Cache Configuration\n|--------------------------------------------------------------------------\n|\n| To give the application a speed boost, we are going to cache all of the\n| configuration files into a single file. The file will be loaded once\n| by the runtime then it will read the configuration values from it.\n|\n*/\n\nStorageDirectories::create();\n\n$app->useStoragePath(StorageDirectories::PATH);\n\nif (isset($_ENV['VAPOR_MAINTENANCE_MODE']) &&\n    $_ENV['VAPOR_MAINTENANCE_MODE'] === 'true') {\n    file_put_contents($app->storagePath().'/framework/down', '[]');\n}\n\nfunction_exists('__vapor_debug') && __vapor_debug('Caching Laravel configuration');\n\ntry {\n    $app->make(ConsoleKernelContract::class)->call('config:cache');\n} catch (Throwable $e) {\n    function_exists('__vapor_debug') && __vapor_debug('Failing caching Laravel configuration: '.$e->getMessage());\n}\n\n/*\n|--------------------------------------------------------------------------\n| Listen For Lambda Invocations\n|--------------------------------------------------------------------------\n|\n| When receiving Lambda requests to the CLI environment, we simply send\n| them to the appropriate handlers based on if they are CLI commands\n| or queued jobs. Then we'll return a response back to the Lambda.\n|\n*/\n\n$invocations = 0;\n\n$lambdaRuntime = LambdaRuntime::fromEnvironmentVariable();\n\nwhile (true) {\n    $lambdaRuntime->nextInvocation(function ($invocationId, $event) {\n        return CliHandlerFactory::make($event)\n            ->handle($event)\n            ->toApiGatewayFormat();\n    });\n\n    LambdaContainer::terminateIfInvocationLimitHasBeenReached(\n        ++$invocations, (int) ($_ENV['VAPOR_MAX_REQUESTS'] ?? 250)\n    );\n}\n"
  },
  {
    "path": "stubs/fpmRuntime.php",
    "content": "<?php\n\nuse hollodotme\\FastCGI\\Exceptions\\WriteFailedException;\nuse Illuminate\\Contracts\\Console\\Kernel as ConsoleKernelContract;\nuse Illuminate\\Support\\Str;\nuse Laravel\\Vapor\\Runtime\\Environment;\nuse Laravel\\Vapor\\Runtime\\Fpm\\Fpm;\nuse Laravel\\Vapor\\Runtime\\Fpm\\FpmHttpHandlerFactory;\nuse Laravel\\Vapor\\Runtime\\LambdaContainer;\nuse Laravel\\Vapor\\Runtime\\LambdaResponse;\nuse Laravel\\Vapor\\Runtime\\LambdaRuntime;\nuse Laravel\\Vapor\\Runtime\\Secrets;\nuse Laravel\\Vapor\\Runtime\\StorageDirectories;\n\n$app = require __DIR__.'/bootstrap/app.php';\n\n/*\n|--------------------------------------------------------------------------\n| Inject SSM Secrets Into Environment\n|--------------------------------------------------------------------------\n|\n| Next, we will inject any of the application's secrets stored in AWS\n| SSM into the environment variables. These variables may be a bit\n| larger than the variables allowed by Lambda which has a limit.\n|\n*/\n\nfunction_exists('__vapor_debug') && __vapor_debug('Preparing to add secrets to runtime');\n\nSecrets::addToEnvironment(\n    $_ENV['VAPOR_SSM_PATH'],\n    json_decode($_ENV['VAPOR_SSM_VARIABLES'] ?? '[]', true),\n    __DIR__.'/vaporSecrets.php'\n);\n\n/*\n|--------------------------------------------------------------------------\n| Inject Decrypted Environment Variables\n|--------------------------------------------------------------------------\n|\n| Next, we will check to see whether a decryption key has been set on the\n| environment. If so, we will attempt to discover an encrypted file at\n| the root of the application and decrypt it into the Vapor runtime.\n|\n*/\n\nEnvironment::decrypt($app);\n\n/*\n|--------------------------------------------------------------------------\n| Cache Configuration\n|--------------------------------------------------------------------------\n|\n| To give the application a speed boost, we are going to cache all of the\n| configuration files into a single file. The file will be loaded once\n| by the runtime then it will read the configuration values from it.\n|\n*/\n\nStorageDirectories::create();\n\n$app->useStoragePath(StorageDirectories::PATH);\n\nfunction_exists('__vapor_debug') && __vapor_debug('Caching Laravel configuration');\n\n$app->make(ConsoleKernelContract::class)->call('config:cache');\n\n/*\n|--------------------------------------------------------------------------\n| Start PHP-FPM\n|--------------------------------------------------------------------------\n|\n| We need to boot the PHP-FPM process with the appropriate handler so it\n| is ready to accept requests. This will initialize this process then\n| wait for this socket to become ready before continuing execution.\n|\n*/\n\nfunction_exists('__vapor_debug') && __vapor_debug('Preparing to boot FPM');\n\n$fpm = Fpm::boot(\n    __DIR__.'/httpHandler.php'\n);\n\n/*\n|--------------------------------------------------------------------------\n| Listen For Lambda Invocations\n|--------------------------------------------------------------------------\n|\n| When using FPM, we will listen for Lambda invocations and proxy them\n| through the FPM process. We'll then return formatted FPM response\n| back to the user. We'll monitor FPM to make sure it is running.\n|\n*/\n\n$invocations = 0;\n\n$lambdaRuntime = LambdaRuntime::fromEnvironmentVariable();\n\nwhile (true) {\n    $lambdaRuntime->nextInvocation(function ($invocationId, $event) {\n        try {\n            return FpmHttpHandlerFactory::make($event)\n                ->handle($event)\n                ->toApiGatewayFormat();\n        } catch (WriteFailedException $e) {\n            if (Str::contains($e->getMessage(), 'Failed to write request to socket [broken pipe]')) {\n                function_exists('__vapor_debug') && __vapor_debug($e->getMessage());\n\n                return (new LambdaResponse(502, [], ''))\n                    ->toApiGatewayFormat();\n            }\n\n            throw $e;\n        }\n    });\n\n    $fpm->ensureRunning();\n\n    LambdaContainer::terminateIfInvocationLimitHasBeenReached(\n        ++$invocations, (int) ($_ENV['VAPOR_MAX_REQUESTS'] ?? 250)\n    );\n}\n"
  },
  {
    "path": "stubs/httpHandler.php",
    "content": "<?php\n\nuse Illuminate\\Http\\Request;\nuse Laravel\\Vapor\\Runtime\\HttpKernel;\n\n/**\n * Laravel - A PHP Framework For Web Artisans.\n *\n * @author   Taylor Otwell <taylor@laravel.com>\n */\ndefine('LARAVEL_START', microtime(true));\n\n/*\n|--------------------------------------------------------------------------\n| Register The Auto Loader\n|--------------------------------------------------------------------------\n|\n| Composer provides a convenient, automatically generated class loader for\n| our application. We just need to utilize it! We'll simply require it\n| into the script here so that we don't have to worry about manual\n| loading any of our classes later on. It feels great to relax.\n|\n*/\n\nrequire __DIR__.'/vendor/autoload.php';\n\n/*\n|--------------------------------------------------------------------------\n| Turn On The Lights\n|--------------------------------------------------------------------------\n|\n| We need to illuminate PHP development, so let us turn on the lights.\n| This bootstraps the framework and gets it ready for use, then it\n| will load up this application so that we can run it and send\n| the responses back to the browser and delight our users.\n|\n*/\n\n$app = require_once __DIR__.'/bootstrap/app.php';\n\n/*\n|--------------------------------------------------------------------------\n| Run The Application\n|--------------------------------------------------------------------------\n|\n| Once we have the application, we can handle the incoming request\n| through the kernel, and send the associated response back to\n| the client's browser allowing them to enjoy the creative\n| and wonderful application we have prepared for them.\n|\n*/\n\n$handler = new HttpKernel($app);\n\n$response = $handler->handle(Request::capture());\n\n$response->send();\n"
  },
  {
    "path": "stubs/httpRuntime.php",
    "content": "<?php\n\n// This file exists for backwards compatibility purposes...\n"
  },
  {
    "path": "stubs/octaneRuntime.php",
    "content": "<?php\n\nuse Illuminate\\Contracts\\Console\\Kernel as ConsoleKernelContract;\nuse Laravel\\Vapor\\Runtime\\Environment;\nuse Laravel\\Vapor\\Runtime\\LambdaContainer;\nuse Laravel\\Vapor\\Runtime\\LambdaRuntime;\nuse Laravel\\Vapor\\Runtime\\Octane\\Octane;\nuse Laravel\\Vapor\\Runtime\\Octane\\OctaneHttpHandlerFactory;\nuse Laravel\\Vapor\\Runtime\\Secrets;\nuse Laravel\\Vapor\\Runtime\\StorageDirectories;\n\n$app = require __DIR__.'/bootstrap/app.php';\n\n/*\n|--------------------------------------------------------------------------\n| Inject SSM Secrets Into Environment\n|--------------------------------------------------------------------------\n|\n| Next, we will inject any of the application's secrets stored in AWS\n| SSM into the environment variables. These variables may be a bit\n| larger than the variables allowed by Lambda which has a limit.\n|\n*/\n\nfunction_exists('__vapor_debug') && __vapor_debug('Preparing to add secrets to runtime');\n\nSecrets::addToEnvironment(\n    $_ENV['VAPOR_SSM_PATH'],\n    json_decode($_ENV['VAPOR_SSM_VARIABLES'] ?? '[]', true),\n    __DIR__.'/vaporSecrets.php'\n);\n\n/*\n|--------------------------------------------------------------------------\n| Inject Decrypted Environment Variables\n|--------------------------------------------------------------------------\n|\n| Next, we will check to see whether a decryption key has been set on the\n| environment. If so, we will attempt to discover an encrypted file at\n| the root of the application and decrypt it into the Vapor runtime.\n|\n*/\n\nEnvironment::decrypt($app);\n\n/*\n|--------------------------------------------------------------------------\n| Cache Configuration\n|--------------------------------------------------------------------------\n|\n| To give the application a speed boost, we are going to cache all of the\n| configuration files into a single file. The file will be loaded once\n| by the runtime then it will read the configuration values from it.\n|\n*/\n\nStorageDirectories::create();\n\n$app->useStoragePath(StorageDirectories::PATH);\n\nfunction_exists('__vapor_debug') && __vapor_debug('Caching Laravel configuration');\n\n$app->make(ConsoleKernelContract::class)->call('config:cache');\n\n/*\n|--------------------------------------------------------------------------\n| Start Octane Worker\n|--------------------------------------------------------------------------\n|\n| We need to boot the application request Octane worker so it's ready to\n| serve incoming requests. This will initialize this worker then wait\n| for Lambda invocations to be received for this Vapor application.\n|\n*/\nfunction_exists('__vapor_debug') && __vapor_debug('Preparing to boot Octane');\n\nOctane::boot(\n    __DIR__,\n    getenv('OCTANE_DATABASE_SESSION_PERSIST') === 'true',\n    getenv('OCTANE_DATABASE_SESSION_TTL') ?: 0\n);\n\n/*\n|--------------------------------------------------------------------------\n| Listen For Lambda Invocations\n|--------------------------------------------------------------------------\n|\n| When using FPM, we will listen for Lambda invocations and proxy them\n| through the FPM process. We'll then return formatted FPM response\n| back to the user. We'll monitor FPM to make sure it is running.\n|\n*/\n\n$invocations = 0;\n\n$lambdaRuntime = LambdaRuntime::fromEnvironmentVariable();\n\nwhile (true) {\n    $lambdaRuntime->nextInvocation(function ($invocationId, $event) {\n        return OctaneHttpHandlerFactory::make($event)\n            ->handle($event)\n            ->toApiGatewayFormat();\n    });\n\n    LambdaContainer::terminateIfInvocationLimitHasBeenReached(\n        ++$invocations, (int) ($_ENV['VAPOR_MAX_REQUESTS'] ?? 250)\n    );\n}\n"
  },
  {
    "path": "stubs/php-fpm.conf",
    "content": "error_log = /dev/null\npid = /tmp/.vapor/php-fpm.pid\nlog_limit= 10000\n\n[default]\npm = static\npm.max_children = 2\npm.max_requests = 250\nlisten = /tmp/.vapor/php-fpm.sock\nclear_env = no\ncatch_workers_output = yes\ndecorate_workers_output = no\n"
  },
  {
    "path": "stubs/rds-combined-ca-bundle.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIEEjCCAvqgAwIBAgIJAM2ZN/+nPi27MA0GCSqGSIb3DQEBCwUAMIGVMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzEmMCQGA1UEAwwdQW1hem9uIFJEUyBhZi1zb3V0aC0xIFJvb3QgQ0Ew\nHhcNMTkxMDI4MTgwNTU4WhcNMjQxMDI2MTgwNTU4WjCBlTELMAkGA1UEBhMCVVMx\nEDAOBgNVBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoM\nGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\nJjAkBgNVBAMMHUFtYXpvbiBSRFMgYWYtc291dGgtMSBSb290IENBMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwR2351uPMZaJk2gMGT+1sk8HE9MQh2rc\n/sCnbxGn2p1c7Oi9aBbd/GiFijeJb2BXvHU+TOq3d3Jjqepq8tapXVt4ojbTJNyC\nJ5E7r7KjTktKdLxtBE1MK25aY+IRJjtdU6vG3KiPKUT1naO3xs3yt0F76WVuFivd\n9OHv2a+KHvPkRUWIxpmAHuMY9SIIMmEZtVE7YZGx5ah0iO4JzItHcbVR0y0PBH55\narpFBddpIVHCacp1FUPxSEWkOpI7q0AaU4xfX0fe1BV5HZYRKpBOIp1TtZWvJD+X\njGUtL1BEsT5vN5g9MkqdtYrC+3SNpAk4VtpvJrdjraI/hhvfeXNnAwIDAQABo2Mw\nYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUEEi/\nWWMcBJsoGXg+EZwkQ0MscZQwHwYDVR0jBBgwFoAUEEi/WWMcBJsoGXg+EZwkQ0Ms\ncZQwDQYJKoZIhvcNAQELBQADggEBAGDZ5js5Pc/gC58LJrwMPXFhJDBS8QuDm23C\nFFUdlqucskwOS3907ErK1ZkmVJCIqFLArHqskFXMAkRZ2PNR7RjWLqBs+0znG5yH\nhRKb4DXzhUFQ18UBRcvT6V6zN97HTRsEEaNhM/7k8YLe7P8vfNZ28VIoJIGGgv9D\nwQBBvkxQ71oOmAG0AwaGD0ORGUfbYry9Dz4a4IcUsZyRWRMADixgrFv6VuETp26s\n/+z+iqNaGWlELBKh3iQCT6Y/1UnkPLO42bxrCSyOvshdkYN58Q2gMTE1SVTqyo8G\nLw8lLAz9bnvUSgHzB3jRrSx6ggF/WRMRYlR++y6LXP4SAsSAaC0=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEEjCCAvqgAwIBAgIJAJYM4LxvTZA6MA0GCSqGSIb3DQEBCwUAMIGVMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzEmMCQGA1UEAwwdQW1hem9uIFJEUyBldS1zb3V0aC0xIFJvb3QgQ0Ew\nHhcNMTkxMDMwMjAyMDM2WhcNMjQxMDI4MjAyMDM2WjCBlTELMAkGA1UEBhMCVVMx\nEDAOBgNVBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoM\nGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\nJjAkBgNVBAMMHUFtYXpvbiBSRFMgZXUtc291dGgtMSBSb290IENBMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqM921jXCXeqpRNCS9CBPOe5N7gMaEt+D\ns5uR3riZbqzRlHGiF1jZihkXfHAIQewDwy+Yz+Oec1aEZCQMhUHxZJPusuX0cJfj\nb+UluFqHIijL2TfXJ3D0PVLLoNTQJZ8+GAPECyojAaNuoHbdVqxhOcznMsXIXVFq\nyVLKDGvyKkJjai/iSPDrQMXufg3kWt0ISjNLvsG5IFXgP4gttsM8i0yvRd4QcHoo\nDjvH7V3cS+CQqW5SnDrGnHToB0RLskE1ET+oNOfeN9PWOxQprMOX/zmJhnJQlTqD\nQP7jcf7SddxrKFjuziFiouskJJyNDsMjt1Lf60+oHZhed2ogTeifGwIDAQABo2Mw\nYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUFBAF\ncgJe/BBuZiGeZ8STfpkgRYQwHwYDVR0jBBgwFoAUFBAFcgJe/BBuZiGeZ8STfpkg\nRYQwDQYJKoZIhvcNAQELBQADggEBAKAYUtlvDuX2UpZW9i1QgsjFuy/ErbW0dLHU\ne/IcFtju2z6RLZ+uF+5A8Kme7IKG1hgt8s+w9TRVQS/7ukQzoK3TaN6XKXRosjtc\no9Rm4gYWM8bmglzY1TPNaiI4HC7546hSwJhubjN0bXCuj/0sHD6w2DkiGuwKNAef\nyTu5vZhPkeNyXLykxkzz7bNp2/PtMBnzIp+WpS7uUDmWyScGPohKMq5PqvL59z+L\nZI3CYeMZrJ5VpXUg3fNNIz/83N3G0sk7wr0ohs/kHTP7xPOYB0zD7Ku4HA0Q9Swf\nWX0qr6UQgTPMjfYDLffI7aEId0gxKw1eGYc6Cq5JAZ3ipi/cBFc=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEEjCCAvqgAwIBAgIJANew34ehz5l8MA0GCSqGSIb3DQEBCwUAMIGVMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzEmMCQGA1UEAwwdQW1hem9uIFJEUyBtZS1zb3V0aC0xIFJvb3QgQ0Ew\nHhcNMTkwNTEwMjE0ODI3WhcNMjQwNTA4MjE0ODI3WjCBlTELMAkGA1UEBhMCVVMx\nEDAOBgNVBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoM\nGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\nJjAkBgNVBAMMHUFtYXpvbiBSRFMgbWUtc291dGgtMSBSb290IENBMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp7BYV88MukcY+rq0r79+C8UzkT30fEfT\naPXbx1d6M7uheGN4FMaoYmL+JE1NZPaMRIPTHhFtLSdPccInvenRDIatcXX+jgOk\nUA6lnHQ98pwN0pfDUyz/Vph4jBR9LcVkBbe0zdoKKp+HGbMPRU0N2yNrog9gM5O8\ngkU/3O2csJ/OFQNnj4c2NQloGMUpEmedwJMOyQQfcUyt9CvZDfIPNnheUS29jGSw\nERpJe/AENu8Pxyc72jaXQuD+FEi2Ck6lBkSlWYQFhTottAeGvVFNCzKszCntrtqd\nrdYUwurYsLTXDHv9nW2hfDUQa0mhXf9gNDOBIVAZugR9NqNRNyYLHQIDAQABo2Mw\nYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU54cf\nDjgwBx4ycBH8+/r8WXdaiqYwHwYDVR0jBBgwFoAU54cfDjgwBx4ycBH8+/r8WXda\niqYwDQYJKoZIhvcNAQELBQADggEBAIIMTSPx/dR7jlcxggr+O6OyY49Rlap2laKA\neC/XI4ySP3vQkIFlP822U9Kh8a9s46eR0uiwV4AGLabcu0iKYfXjPkIprVCqeXV7\nny9oDtrbflyj7NcGdZLvuzSwgl9SYTJp7PVCZtZutsPYlbJrBPHwFABvAkMvRtDB\nhitIg4AESDGPoCl94sYHpfDfjpUDMSrAMDUyO6DyBdZH5ryRMAs3lGtsmkkNUrso\naTW6R05681Z0mvkRdb+cdXtKOSuDZPoe2wJJIaz3IlNQNSrB5TImMYgmt6iAsFhv\n3vfTSTKrZDNTJn4ybG6pq1zWExoXsktZPylJly6R3RBwV6nwqBM=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBjCCAu6gAwIBAgIJAMc0ZzaSUK51MA0GCSqGSIb3DQEBCwUAMIGPMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkw\nODIyMTcwODUwWhcNMjQwODIyMTcwODUwWjCBjzELMAkGA1UEBhMCVVMxEDAOBgNV\nBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoMGUFtYXpv\nbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxIDAeBgNV\nBAMMF0FtYXpvbiBSRFMgUm9vdCAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEArXnF/E6/Qh+ku3hQTSKPMhQQlCpoWvnIthzX6MK3p5a0eXKZ\noWIjYcNNG6UwJjp4fUXl6glp53Jobn+tWNX88dNH2n8DVbppSwScVE2LpuL+94vY\n0EYE/XxN7svKea8YvlrqkUBKyxLxTjh+U/KrGOaHxz9v0l6ZNlDbuaZw3qIWdD/I\n6aNbGeRUVtpM6P+bWIoxVl/caQylQS6CEYUk+CpVyJSkopwJlzXT07tMoDL5WgX9\nO08KVgDNz9qP/IGtAcRduRcNioH3E9v981QO1zt/Gpb2f8NqAjUUCUZzOnij6mx9\nMcZ+9cWX88CRzR0vQODWuZscgI08NvM69Fn2SQIDAQABo2MwYTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUc19g2LzLA5j0Kxc0LjZa\npmD/vB8wHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJKoZIhvcN\nAQELBQADggEBAHAG7WTmyjzPRIM85rVj+fWHsLIvqpw6DObIjMWokpliCeMINZFV\nynfgBKsf1ExwbvJNzYFXW6dihnguDG9VMPpi2up/ctQTN8tm9nDKOy08uNZoofMc\nNUZxKCEkVKZv+IL4oHoeayt8egtv3ujJM6V14AstMQ6SwvwvA93EP/Ug2e4WAXHu\ncbI1NAbUgVDqp+DRdfvZkgYKryjTWd/0+1fS8X1bBZVWzl7eirNVnHbSH2ZDpNuY\n0SBd8dj5F6ld3t58ydZbrTHze7JJOd8ijySAp4/kiu9UfZWuTPABzDa/DSdz9Dk/\nzPW4CXXvhLmE02TA9/HeCw3KEHIwicNuEfw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEEDCCAvigAwIBAgIJAKFMXyltvuRdMA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJEUyBCZXRhIFJvb3QgMjAxOSBDQTAe\nFw0xOTA4MTkxNzM4MjZaFw0yNDA4MTkxNzM4MjZaMIGUMQswCQYDVQQGEwJVUzEQ\nMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEiMCAGA1UECgwZ\nQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEl\nMCMGA1UEAwwcQW1hem9uIFJEUyBCZXRhIFJvb3QgMjAxOSBDQTCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAMkZdnIH9ndatGAcFo+DppGJ1HUt4x+zeO+0\nZZ29m0sfGetVulmTlv2d5b66e+QXZFWpcPQMouSxxYTW08TbrQiZngKr40JNXftA\natvzBqIImD4II0ZX5UEVj2h98qe/ypW5xaDN7fEa5e8FkYB1TEemPaWIbNXqchcL\ntV7IJPr3Cd7Z5gZJlmujIVDPpMuSiNaal9/6nT9oqN+JSM1fx5SzrU5ssg1Vp1vv\n5Xab64uOg7wCJRB9R2GC9XD04odX6VcxUAGrZo6LR64ZSifupo3l+R5sVOc5i8NH\nskdboTzU9H7+oSdqoAyhIU717PcqeDum23DYlPE2nGBWckE+eT8CAwEAAaNjMGEw\nDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFK2hDBWl\nsbHzt/EHd0QYOooqcFPhMB8GA1UdIwQYMBaAFK2hDBWlsbHzt/EHd0QYOooqcFPh\nMA0GCSqGSIb3DQEBCwUAA4IBAQAO/718k8EnOqJDx6wweUscGTGL/QdKXUzTVRAx\nJUsjNUv49mH2HQVEW7oxszfH6cPCaupNAddMhQc4C/af6GHX8HnqfPDk27/yBQI+\nyBBvIanGgxv9c9wBbmcIaCEWJcsLp3HzXSYHmjiqkViXwCpYfkoV3Ns2m8bp+KCO\ny9XmcCKRaXkt237qmoxoh2sGmBHk2UlQtOsMC0aUQ4d7teAJG0q6pbyZEiPyKZY1\nXR/UVxMJL0Q4iVpcRS1kaNCMfqS2smbLJeNdsan8pkw1dvPhcaVTb7CvjhJtjztF\nYfDzAI5794qMlWxwilKMmUvDlPPOTen8NNHkLwWvyFCH7Doh\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEFjCCAv6gAwIBAgIJAMzYZJ+R9NBVMA0GCSqGSIb3DQEBCwUAMIGXMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzEoMCYGA1UEAwwfQW1hem9uIFJEUyBQcmV2aWV3IFJvb3QgMjAxOSBD\nQTAeFw0xOTA4MjEyMjI5NDlaFw0yNDA4MjEyMjI5NDlaMIGXMQswCQYDVQQGEwJV\nUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEiMCAGA1UE\nCgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJE\nUzEoMCYGA1UEAwwfQW1hem9uIFJEUyBQcmV2aWV3IFJvb3QgMjAxOSBDQTCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7kkS6vjgKKQTPynC2NjdN5aPPV\nO71G0JJS/2ARVBVJd93JLiGovVJilfWYfwZCs4gTRSSjrUD4D4HyqCd6A+eEEtJq\nM0DEC7i0dC+9WNTsPszuB206Jy2IUmxZMIKJAA1NHSbIMjB+b6/JhbSUi7nKdbR/\nbrj83bF+RoSA+ogrgX7mQbxhmFcoZN9OGaJgYKsKWUt5Wqv627KkGodUK8mDepgD\nS3ZfoRQRx3iceETpcmHJvaIge6+vyDX3d9Z22jmvQ4AKv3py2CmU2UwuhOltFDwB\n0ddtb39vgwrJxaGfiMRHpEP1DfNLWHAnA69/pgZPwIggidS+iBPUhgucMp8CAwEA\nAaNjMGEwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\nFGnTGpQuQ2H/DZlXMQijZEhjs7TdMB8GA1UdIwQYMBaAFGnTGpQuQ2H/DZlXMQij\nZEhjs7TdMA0GCSqGSIb3DQEBCwUAA4IBAQC3xz1vQvcXAfpcZlngiRWeqU8zQAMQ\nLZPCFNv7PVk4pmqX+ZiIRo4f9Zy7TrOVcboCnqmP/b/mNq0gVF4O+88jwXJZD+f8\n/RnABMZcnGU+vK0YmxsAtYU6TIb1uhRFmbF8K80HHbj9vSjBGIQdPCbvmR2zY6VJ\nBYM+w9U9hp6H4DVMLKXPc1bFlKA5OBTgUtgkDibWJKFOEPW3UOYwp9uq6pFoN0AO\nxMTldqWFsOF3bJIlvOY0c/1EFZXu3Ns6/oCP//Ap9vumldYMUZWmbK+gK33FPOXV\n8BQ6jNC29icv7lLDpRPwjibJBXX+peDR5UK4FdYcswWEB1Tix5X8dYu6\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZUxCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSYwJAYDVQQDDB1BbWF6b24gUkRTIGFmLXNvdXRoLTEgUm9vdCBDQTAeFw0xOTEw\nMjgxODA2NTNaFw0yNDEwMjgxODA2NTNaMIGQMQswCQYDVQQGEwJVUzETMBEGA1UE\nCAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9u\nIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEhMB8GA1UE\nAwwYQW1hem9uIFJEUyBhZi1zb3V0aC0xIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEAvtV1OqmFa8zCVQSKOvPUJERLVFtd4rZmDpImc5rIoeBk7w/P\n9lcKUJjO8R/w1a2lJXx3oQ81tiY0Piw6TpT62YWVRMWrOw8+Vxq1dNaDSFp9I8d0\nUHillSSbOk6FOrPDp+R6AwbGFqUDebbN5LFFoDKbhNmH1BVS0a6YNKpGigLRqhka\ncClPslWtPqtjbaP3Jbxl26zWzLo7OtZl98dR225pq8aApNBwmtgA7Gh60HK/cX0t\n32W94n8D+GKSg6R4MKredVFqRTi9hCCNUu0sxYPoELuM+mHiqB5NPjtm92EzCWs+\n+vgWhMc6GxG+82QSWx1Vj8sgLqtE/vLrWddf5QIDAQABo2YwZDAOBgNVHQ8BAf8E\nBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUuLB4gYVJrSKJj/Gz\npqc6yeA+RcAwHwYDVR0jBBgwFoAUEEi/WWMcBJsoGXg+EZwkQ0MscZQwDQYJKoZI\nhvcNAQELBQADggEBABauYOZxUhe9/RhzGJ8MsWCz8eKcyDVd4FCnY6Qh+9wcmYNT\nLtnD88LACtJKb/b81qYzcB0Em6+zVJ3Z9jznfr6buItE6es9wAoja22Xgv44BTHL\nrimbgMwpTt3uEMXDffaS0Ww6YWb3pSE0XYI2ISMWz+xRERRf+QqktSaL39zuiaW5\ntfZMre+YhohRa/F0ZQl3RCd6yFcLx4UoSPqQsUl97WhYzwAxZZfwvLJXOc4ATt3u\nVlCUylNDkaZztDJc/yN5XQoK9W5nOt2cLu513MGYKbuarQr8f+gYU8S+qOyuSRSP\nNRITzwCRVnsJE+2JmcRInn/NcanB7uOGqTvJ9+c=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZUxCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSYwJAYDVQQDDB1BbWF6b24gUkRTIGV1LXNvdXRoLTEgUm9vdCBDQTAeFw0xOTEw\nMzAyMDIxMzBaFw0yNDEwMzAyMDIxMzBaMIGQMQswCQYDVQQGEwJVUzETMBEGA1UE\nCAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9u\nIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEhMB8GA1UE\nAwwYQW1hem9uIFJEUyBldS1zb3V0aC0xIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEAtEyjYcajx6xImJn8Vz1zjdmL4ANPgQXwF7+tF7xccmNAZETb\nbzb3I9i5fZlmrRaVznX+9biXVaGxYzIUIR3huQ3Q283KsDYnVuGa3mk690vhvJbB\nQIPgKa5mVwJppnuJm78KqaSpi0vxyCPe3h8h6LLFawVyWrYNZ4okli1/U582eef8\nRzJp/Ear3KgHOLIiCdPDF0rjOdCG1MOlDLixVnPn9IYOciqO+VivXBg+jtfc5J+L\nAaPm0/Yx4uELt1tkbWkm4BvTU/gBOODnYziITZM0l6Fgwvbwgq5duAtKW+h031lC\n37rEvrclqcp4wrsUYcLAWX79ZyKIlRxcAdvEhQIDAQABo2YwZDAOBgNVHQ8BAf8E\nBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU7zPyc0azQxnBCe7D\nb9KAadH1QSEwHwYDVR0jBBgwFoAUFBAFcgJe/BBuZiGeZ8STfpkgRYQwDQYJKoZI\nhvcNAQELBQADggEBAFGaNiYxg7yC/xauXPlaqLCtwbm2dKyK9nIFbF/7be8mk7Q3\nMOA0of1vGHPLVQLr6bJJpD9MAbUcm4cPAwWaxwcNpxOjYOFDaq10PCK4eRAxZWwF\nNJRIRmGsl8NEsMNTMCy8X+Kyw5EzH4vWFl5Uf2bGKOeFg0zt43jWQVOX6C+aL3Cd\npRS5MhmYpxMG8irrNOxf4NVFE2zpJOCm3bn0STLhkDcV/ww4zMzObTJhiIb5wSWn\nEXKKWhUXuRt7A2y1KJtXpTbSRHQxE++69Go1tWhXtRiULCJtf7wF2Ksm0RR/AdXT\n1uR1vKyH5KBJPX3ppYkQDukoHTFR0CpB+G84NLo=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZUxCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSYwJAYDVQQDDB1BbWF6b24gUkRTIG1lLXNvdXRoLTEgUm9vdCBDQTAeFw0xOTA1\nMTAyMTU4NDNaFw0yNTA2MDExMjAwMDBaMIGQMQswCQYDVQQGEwJVUzETMBEGA1UE\nCAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9u\nIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEhMB8GA1UE\nAwwYQW1hem9uIFJEUyBtZS1zb3V0aC0xIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEAudOYPZH+ihJAo6hNYMB5izPVBe3TYhnZm8+X3IoaaYiKtsp1\nJJhkTT0CEejYIQ58Fh4QrMUyWvU8qsdK3diNyQRoYLbctsBPgxBR1u07eUJDv38/\nC1JlqgHmMnMi4y68Iy7ymv50QgAMuaBqgEBRI1R6Lfbyrb2YvH5txjJyTVMwuCfd\nYPAtZVouRz0JxmnfsHyxjE+So56uOKTDuw++Ho4HhZ7Qveej7XB8b+PIPuroknd3\nFQB5RVbXRvt5ZcVD4F2fbEdBniF7FAF4dEiofVCQGQ2nynT7dZdEIPfPdH3n7ZmE\nlAOmwHQ6G83OsiHRBLnbp+QZRgOsjkHJxT20bQIDAQABo2YwZDAOBgNVHQ8BAf8E\nBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUOEVDM7VomRH4HVdA\nQvIMNq2tXOcwHwYDVR0jBBgwFoAU54cfDjgwBx4ycBH8+/r8WXdaiqYwDQYJKoZI\nhvcNAQELBQADggEBAHhvMssj+Th8IpNePU6RH0BiL6o9c437R3Q4IEJeFdYL+nZz\nPW/rELDPvLRUNMfKM+KzduLZ+l29HahxefejYPXtvXBlq/E/9czFDD4fWXg+zVou\nuDXhyrV4kNmP4S0eqsAP/jQHPOZAMFA4yVwO9hlqmePhyDnszCh9c1PfJSBh49+b\n4w7i/L3VBOMt8j3EKYvqz0gVfpeqhJwL4Hey8UbVfJRFJMJzfNHpePqtDRAY7yjV\nPYquRaV2ab/E+/7VFkWMM4tazYz/qsYA2jSH+4xDHvYk8LnsbcrF9iuidQmEc5sb\nFgcWaSKG4DJjcI5k7AJLWcXyTDt21Ci43LE+I9Q=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECDCCAvCgAwIBAgICVIYwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MDQxNzEz\nMDRaFw0yNDA4MjIxNzA4NTBaMIGVMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEmMCQGA1UEAwwdQW1h\nem9uIFJEUyBhcC1zb3V0aC0xIDIwMTkgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB\nDwAwggEKAoIBAQDUYOz1hGL42yUCrcsMSOoU8AeD/3KgZ4q7gP+vAz1WnY9K/kim\neWN/2Qqzlo3+mxSFQFyD4MyV3+CnCPnBl9Sh1G/F6kThNiJ7dEWSWBQGAB6HMDbC\nBaAsmUc1UIz8sLTL3fO+S9wYhA63Wun0Fbm/Rn2yk/4WnJAaMZcEtYf6e0KNa0LM\np/kN/70/8cD3iz3dDR8zOZFpHoCtf0ek80QqTich0A9n3JLxR6g6tpwoYviVg89e\nqCjQ4axxOkWWeusLeTJCcY6CkVyFvDAKvcUl1ytM5AiaUkXblE7zDFXRM4qMMRdt\nlPm8d3pFxh0fRYk8bIKnpmtOpz3RIctDrZZxAgMBAAGjZjBkMA4GA1UdDwEB/wQE\nAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBT99wKJftD3jb4sHoHG\ni3uGlH6W6TAfBgNVHSMEGDAWgBRzX2DYvMsDmPQrFzQuNlqmYP+8HzANBgkqhkiG\n9w0BAQsFAAOCAQEAZ17hhr3dII3hUfuHQ1hPWGrpJOX/G9dLzkprEIcCidkmRYl+\nhu1Pe3caRMh/17+qsoEErmnVq5jNY9X1GZL04IZH8YbHc7iRHw3HcWAdhN8633+K\njYEB2LbJ3vluCGnCejq9djDb6alOugdLMJzxOkHDhMZ6/gYbECOot+ph1tQuZXzD\ntZ7prRsrcuPBChHlPjmGy8M9z8u+kF196iNSUGC4lM8vLkHM7ycc1/ZOwRq9aaTe\niOghbQQyAEe03MWCyDGtSmDfr0qEk+CHN+6hPiaL8qKt4s+V9P7DeK4iW08ny8Ox\nAVS7u0OK/5+jKMAMrKwpYrBydOjTUTHScocyNw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBzCCAu+gAwIBAgICQ2QwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MDUxODQ2\nMjlaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\nem9uIFJEUyBzYS1lYXN0LTEgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAMMvR+ReRnOzqJzoaPipNTt1Z2VA968jlN1+SYKUrYM3No+Vpz0H\nM6Tn0oYB66ByVsXiGc28ulsqX1HbHsxqDPwvQTKvO7SrmDokoAkjJgLocOLUAeld\n5AwvUjxGRP6yY90NV7X786MpnYb2Il9DIIaV9HjCmPt+rjy2CZjS0UjPjCKNfB8J\nbFjgW6GGscjeyGb/zFwcom5p4j0rLydbNaOr9wOyQrtt3ZQWLYGY9Zees/b8pmcc\nJt+7jstZ2UMV32OO/kIsJ4rMUn2r/uxccPwAc1IDeRSSxOrnFKhW3Cu69iB3bHp7\nJbawY12g7zshE4I14sHjv3QoXASoXjx4xgMCAwEAAaNmMGQwDgYDVR0PAQH/BAQD\nAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI1Fc/Ql2jx+oJPgBVYq\nccgP0pQ8MB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\nDQEBCwUAA4IBAQB4VVVabVp70myuYuZ3vltQIWqSUMhkaTzehMgGcHjMf9iLoZ/I\n93KiFUSGnek5cRePyS9wcpp0fcBT3FvkjpUdCjVtdttJgZFhBxgTd8y26ImdDDMR\n4+BUuhI5msvjL08f+Vkkpu1GQcGmyFVPFOy/UY8iefu+QyUuiBUnUuEDd49Hw0Fn\n/kIPII6Vj82a2mWV/Q8e+rgN8dIRksRjKI03DEoP8lhPlsOkhdwU6Uz9Vu6NOB2Q\nLs1kbcxAc7cFSyRVJEhh12Sz9d0q/CQSTFsVJKOjSNQBQfVnLz1GwO/IieUEAr4C\njkTntH0r1LX5b/GwN4R887LvjAEdTbg1his7\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECDCCAvCgAwIBAgIDAIkHMA0GCSqGSIb3DQEBCwUAMIGPMQswCQYDVQQGEwJV\nUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEiMCAGA1UE\nCgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJE\nUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkwOTA2MTc0\nMDIxWhcNMjQwODIyMTcwODUwWjCBlDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldh\nc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoMGUFtYXpvbiBXZWIg\nU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxJTAjBgNVBAMMHEFt\nYXpvbiBSRFMgdXMtd2VzdC0xIDIwMTkgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB\nDwAwggEKAoIBAQDD2yzbbAl77OofTghDMEf624OvU0eS9O+lsdO0QlbfUfWa1Kd6\n0WkgjkLZGfSRxEHMCnrv4UPBSK/Qwn6FTjkDLgemhqBtAnplN4VsoDL+BkRX4Wwq\n/dSQJE2b+0hm9w9UMVGFDEq1TMotGGTD2B71eh9HEKzKhGzqiNeGsiX4VV+LJzdH\nuM23eGisNqmd4iJV0zcAZ+Gbh2zK6fqTOCvXtm7Idccv8vZZnyk1FiWl3NR4WAgK\nAkvWTIoFU3Mt7dIXKKClVmvssG8WHCkd3Xcb4FHy/G756UZcq67gMMTX/9fOFM/v\nl5C0+CHl33Yig1vIDZd+fXV1KZD84dEJfEvHAgMBAAGjZjBkMA4GA1UdDwEB/wQE\nAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBR+ap20kO/6A7pPxo3+\nT3CfqZpQWjAfBgNVHSMEGDAWgBRzX2DYvMsDmPQrFzQuNlqmYP+8HzANBgkqhkiG\n9w0BAQsFAAOCAQEAHCJky2tPjPttlDM/RIqExupBkNrnSYnOK4kr9xJ3sl8UF2DA\nPAnYsjXp3rfcjN/k/FVOhxwzi3cXJF/2Tjj39Bm/OEfYTOJDNYtBwB0VVH4ffa/6\ntZl87jaIkrxJcreeeHqYMnIxeN0b/kliyA+a5L2Yb0VPjt9INq34QDc1v74FNZ17\n4z8nr1nzg4xsOWu0Dbjo966lm4nOYIGBRGOKEkHZRZ4mEiMgr3YLkv8gSmeitx57\nZ6dVemNtUic/LVo5Iqw4n3TBS0iF2C1Q1xT/s3h+0SXZlfOWttzSluDvoMv5PvCd\npFjNn+aXLAALoihL1MJSsxydtsLjOBro5eK0Vw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEDDCCAvSgAwIBAgICOFAwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTAxNzQ2\nMjFaFw0yNDA4MjIxNzA4NTBaMIGZMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEqMCgGA1UEAwwhQW1h\nem9uIFJEUyBhcC1ub3J0aGVhc3QtMiAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAzU72e6XbaJbi4HjJoRNjKxzUEuChKQIt7k3CWzNnmjc5\n8I1MjCpa2W1iw1BYVysXSNSsLOtUsfvBZxi/1uyMn5ZCaf9aeoA9UsSkFSZBjOCN\nDpKPCmfV1zcEOvJz26+1m8WDg+8Oa60QV0ou2AU1tYcw98fOQjcAES0JXXB80P2s\n3UfkNcnDz+l4k7j4SllhFPhH6BQ4lD2NiFAP4HwoG6FeJUn45EPjzrydxjq6v5Fc\ncQ8rGuHADVXotDbEhaYhNjIrsPL+puhjWfhJjheEw8c4whRZNp6gJ/b6WEes/ZhZ\nh32DwsDsZw0BfRDUMgUn8TdecNexHUw8vQWeC181hwIDAQABo2YwZDAOBgNVHQ8B\nAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUwW9bWgkWkr0U\nlrOsq2kvIdrECDgwHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJ\nKoZIhvcNAQELBQADggEBAEugF0Gj7HVhX0ehPZoGRYRt3PBuI2YjfrrJRTZ9X5wc\n9T8oHmw07mHmNy1qqWvooNJg09bDGfB0k5goC2emDiIiGfc/kvMLI7u+eQOoMKj6\nmkfCncyRN3ty08Po45vTLBFZGUvtQmjM6yKewc4sXiASSBmQUpsMbiHRCL72M5qV\nobcJOjGcIdDTmV1BHdWT+XcjynsGjUqOvQWWhhLPrn4jWe6Xuxll75qlrpn3IrIx\nCRBv/5r7qbcQJPOgwQsyK4kv9Ly8g7YT1/vYBlR3cRsYQjccw5ceWUj2DrMVWhJ4\nprf+E3Aa4vYmLLOUUvKnDQ1k3RGNu56V0tonsQbfsaM=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECjCCAvKgAwIBAgICEzUwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTAyMDUy\nMjVaFw0yNDA4MjIxNzA4NTBaMIGXMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEoMCYGA1UEAwwfQW1h\nem9uIFJEUyBjYS1jZW50cmFsLTEgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAOxHqdcPSA2uBjsCP4DLSlqSoPuQ/X1kkJLusVRKiQE2zayB\nviuCBt4VB9Qsh2rW3iYGM+usDjltGnI1iUWA5KHcvHszSMkWAOYWLiMNKTlg6LCp\nXnE89tvj5dIH6U8WlDvXLdjB/h30gW9JEX7S8supsBSci2GxEzb5mRdKaDuuF/0O\nqvz4YE04pua3iZ9QwmMFuTAOYzD1M72aOpj+7Ac+YLMM61qOtU+AU6MndnQkKoQi\nqmUN2A9IFaqHFzRlSdXwKCKUA4otzmz+/N3vFwjb5F4DSsbsrMfjeHMo6o/nb6Nh\nYDb0VJxxPee6TxSuN7CQJ2FxMlFUezcoXqwqXD0CAwEAAaNmMGQwDgYDVR0PAQH/\nBAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFDGGpon9WfIpsggE\nCxHq8hZ7E2ESMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqG\nSIb3DQEBCwUAA4IBAQAvpeQYEGZvoTVLgV9rd2+StPYykMsmFjWQcyn3dBTZRXC2\nlKq7QhQczMAOhEaaN29ZprjQzsA2X/UauKzLR2Uyqc2qOeO9/YOl0H3qauo8C/W9\nr8xqPbOCDLEXlOQ19fidXyyEPHEq5WFp8j+fTh+s8WOx2M7IuC0ANEetIZURYhSp\nxl9XOPRCJxOhj7JdelhpweX0BJDNHeUFi0ClnFOws8oKQ7sQEv66d5ddxqqZ3NVv\nRbCvCtEutQMOUMIuaygDlMn1anSM8N7Wndx8G6+Uy67AnhjGx7jw/0YPPxopEj6x\nJXP8j0sJbcT9K/9/fPVLNT25RvQ/93T2+IQL4Ca2\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBzCCAu+gAwIBAgICYpgwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTExNzMx\nNDhaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\nem9uIFJEUyBldS13ZXN0LTEgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAMk3YdSZ64iAYp6MyyKtYJtNzv7zFSnnNf6vv0FB4VnfITTMmOyZ\nLXqKAT2ahZ00hXi34ewqJElgU6eUZT/QlzdIu359TEZyLVPwURflL6SWgdG01Q5X\nO++7fSGcBRyIeuQWs9FJNIIqK8daF6qw0Rl5TXfu7P9dBc3zkgDXZm2DHmxGDD69\n7liQUiXzoE1q2Z9cA8+jirDioJxN9av8hQt12pskLQumhlArsMIhjhHRgF03HOh5\ntvi+RCfihVOxELyIRTRpTNiIwAqfZxxTWFTgfn+gijTmd0/1DseAe82aYic8JbuS\nEMbrDduAWsqrnJ4GPzxHKLXX0JasCUcWyMECAwEAAaNmMGQwDgYDVR0PAQH/BAQD\nAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFPLtsq1NrwJXO13C9eHt\nsLY11AGwMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\nDQEBCwUAA4IBAQAnWBKj5xV1A1mYd0kIgDdkjCwQkiKF5bjIbGkT3YEFFbXoJlSP\n0lZZ/hDaOHI8wbLT44SzOvPEEmWF9EE7SJzkvSdQrUAWR9FwDLaU427ALI3ngNHy\nlGJ2hse1fvSRNbmg8Sc9GBv8oqNIBPVuw+AJzHTacZ1OkyLZrz1c1QvwvwN2a+Jd\nvH0V0YIhv66llKcYDMUQJAQi4+8nbRxXWv6Gq3pvrFoorzsnkr42V3JpbhnYiK+9\nnRKd4uWl62KRZjGkfMbmsqZpj2fdSWMY1UGyN1k+kDmCSWYdrTRDP0xjtIocwg+A\nJ116n4hV/5mbA0BaPiS2krtv17YAeHABZcvz\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECjCCAvKgAwIBAgICV2YwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTExOTM2\nMjBaFw0yNDA4MjIxNzA4NTBaMIGXMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEoMCYGA1UEAwwfQW1h\nem9uIFJEUyBldS1jZW50cmFsLTEgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAMEx54X2pHVv86APA0RWqxxRNmdkhAyp2R1cFWumKQRofoFv\nn+SPXdkpIINpMuEIGJANozdiEz7SPsrAf8WHyD93j/ZxrdQftRcIGH41xasetKGl\nI67uans8d+pgJgBKGb/Z+B5m+UsIuEVekpvgpwKtmmaLFC/NCGuSsJoFsRqoa6Gh\nm34W6yJoY87UatddCqLY4IIXaBFsgK9Q/wYzYLbnWM6ZZvhJ52VMtdhcdzeTHNW0\n5LGuXJOF7Ahb4JkEhoo6TS2c0NxB4l4MBfBPgti+O7WjR3FfZHpt18A6Zkq6A2u6\nD/oTSL6c9/3sAaFTFgMyL3wHb2YlW0BPiljZIqECAwEAAaNmMGQwDgYDVR0PAQH/\nBAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFOcAToAc6skWffJa\nTnreaswAfrbcMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqG\nSIb3DQEBCwUAA4IBAQA1d0Whc1QtspK496mFWfFEQNegLh0a9GWYlJm+Htcj5Nxt\nDAIGXb+8xrtOZFHmYP7VLCT5Zd2C+XytqseK/+s07iAr0/EPF+O2qcyQWMN5KhgE\ncXw2SwuP9FPV3i+YAm11PBVeenrmzuk9NrdHQ7TxU4v7VGhcsd2C++0EisrmquWH\nmgIfmVDGxphwoES52cY6t3fbnXmTkvENvR+h3rj+fUiSz0aSo+XZUGHPgvuEKM/W\nCBD9Smc9CBoBgvy7BgHRgRUmwtABZHFUIEjHI5rIr7ZvYn+6A0O6sogRfvVYtWFc\nqpyrW1YX8mD0VlJ8fGKM3G+aCOsiiPKDV/Uafrm+\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECDCCAvCgAwIBAgICGAcwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTIxODE5\nNDRaFw0yNDA4MjIxNzA4NTBaMIGVMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEmMCQGA1UEAwwdQW1h\nem9uIFJEUyBldS1ub3J0aC0xIDIwMTkgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB\nDwAwggEKAoIBAQCiIYnhe4UNBbdBb/nQxl5giM0XoVHWNrYV5nB0YukA98+TPn9v\nAoj1RGYmtryjhrf01Kuv8SWO+Eom95L3zquoTFcE2gmxCfk7bp6qJJ3eHOJB+QUO\nXsNRh76fwDzEF1yTeZWH49oeL2xO13EAx4PbZuZpZBttBM5zAxgZkqu4uWQczFEs\nJXfla7z2fvWmGcTagX10O5C18XaFroV0ubvSyIi75ue9ykg/nlFAeB7O0Wxae88e\nuhiBEFAuLYdqWnsg3459NfV8Yi1GnaitTym6VI3tHKIFiUvkSiy0DAlAGV2iiyJE\nq+DsVEO4/hSINJEtII4TMtysOsYPpINqeEzRAgMBAAGjZjBkMA4GA1UdDwEB/wQE\nAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBRR0UpnbQyjnHChgmOc\nhnlc0PogzTAfBgNVHSMEGDAWgBRzX2DYvMsDmPQrFzQuNlqmYP+8HzANBgkqhkiG\n9w0BAQsFAAOCAQEAKJD4xVzSf4zSGTBJrmamo86jl1NHQxXUApAZuBZEc8tqC6TI\nT5CeoSr9CMuVC8grYyBjXblC4OsM5NMvmsrXl/u5C9dEwtBFjo8mm53rOOIm1fxl\nI1oYB/9mtO9ANWjkykuLzWeBlqDT/i7ckaKwalhLODsRDO73vRhYNjsIUGloNsKe\npxw3dzHwAZx4upSdEVG4RGCZ1D0LJ4Gw40OfD69hfkDfRVVxKGrbEzqxXRvovmDc\ntKLdYZO/6REoca36v4BlgIs1CbUXJGLSXUwtg7YXGLSVBJ/U0+22iGJmBSNcoyUN\ncjPFD9JQEhDDIYYKSGzIYpvslvGc4T5ISXFiuQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBzCCAu+gAwIBAgICZIEwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTIyMTMy\nMzJaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\nem9uIFJEUyBldS13ZXN0LTIgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBALGiwqjiF7xIjT0Sx7zB3764K2T2a1DHnAxEOr+/EIftWKxWzT3u\nPFwS2eEZcnKqSdRQ+vRzonLBeNLO4z8aLjQnNbkizZMBuXGm4BqRm1Kgq3nlLDQn\n7YqdijOq54SpShvR/8zsO4sgMDMmHIYAJJOJqBdaus2smRt0NobIKc0liy7759KB\n6kmQ47Gg+kfIwxrQA5zlvPLeQImxSoPi9LdbRoKvu7Iot7SOa+jGhVBh3VdqndJX\n7tm/saj4NE375csmMETFLAOXjat7zViMRwVorX4V6AzEg1vkzxXpA9N7qywWIT5Y\nfYaq5M8i6vvLg0CzrH9fHORtnkdjdu1y+0MCAwEAAaNmMGQwDgYDVR0PAQH/BAQD\nAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFFOhOx1yt3Z7mvGB9jBv\n2ymdZwiOMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\nDQEBCwUAA4IBAQBehqY36UGDvPVU9+vtaYGr38dBbp+LzkjZzHwKT1XJSSUc2wqM\nhnCIQKilonrTIvP1vmkQi8qHPvDRtBZKqvz/AErW/ZwQdZzqYNFd+BmOXaeZWV0Q\noHtDzXmcwtP8aUQpxN0e1xkWb1E80qoy+0uuRqb/50b/R4Q5qqSfJhkn6z8nwB10\n7RjLtJPrK8igxdpr3tGUzfAOyiPrIDncY7UJaL84GFp7WWAkH0WG3H8Y8DRcRXOU\nmqDxDLUP3rNuow3jnGxiUY+gGX5OqaZg4f4P6QzOSmeQYs6nLpH0PiN00+oS1BbD\nbpWdZEttILPI+vAYkU4QuBKKDjJL6HbSd+cn\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECDCCAvCgAwIBAgIDAIVCMA0GCSqGSIb3DQEBCwUAMIGPMQswCQYDVQQGEwJV\nUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEiMCAGA1UE\nCgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJE\nUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkwOTEzMTcw\nNjQxWhcNMjQwODIyMTcwODUwWjCBlDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldh\nc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoMGUFtYXpvbiBXZWIg\nU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxJTAjBgNVBAMMHEFt\nYXpvbiBSRFMgdXMtZWFzdC0yIDIwMTkgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB\nDwAwggEKAoIBAQDE+T2xYjUbxOp+pv+gRA3FO24+1zCWgXTDF1DHrh1lsPg5k7ht\n2KPYzNc+Vg4E+jgPiW0BQnA6jStX5EqVh8BU60zELlxMNvpg4KumniMCZ3krtMUC\nau1NF9rM7HBh+O+DYMBLK5eSIVt6lZosOb7bCi3V6wMLA8YqWSWqabkxwN4w0vXI\n8lu5uXXFRemHnlNf+yA/4YtN4uaAyd0ami9+klwdkZfkrDOaiy59haOeBGL8EB/c\ndbJJlguHH5CpCscs3RKtOOjEonXnKXldxarFdkMzi+aIIjQ8GyUOSAXHtQHb3gZ4\nnS6Ey0CMlwkB8vUObZU9fnjKJcL5QCQqOfwvAgMBAAGjZjBkMA4GA1UdDwEB/wQE\nAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBQUPuRHohPxx4VjykmH\n6usGrLL1ETAfBgNVHSMEGDAWgBRzX2DYvMsDmPQrFzQuNlqmYP+8HzANBgkqhkiG\n9w0BAQsFAAOCAQEAUdR9Vb3y33Yj6X6KGtuthZ08SwjImVQPtknzpajNE5jOJAh8\nquvQnU9nlnMO85fVDU1Dz3lLHGJ/YG1pt1Cqq2QQ200JcWCvBRgdvH6MjHoDQpqZ\nHvQ3vLgOGqCLNQKFuet9BdpsHzsctKvCVaeBqbGpeCtt3Hh/26tgx0rorPLw90A2\nV8QSkZJjlcKkLa58N5CMM8Xz8KLWg3MZeT4DmlUXVCukqK2RGuP2L+aME8dOxqNv\nOnOz1zrL5mR2iJoDpk8+VE/eBDmJX40IJk6jBjWoxAO/RXq+vBozuF5YHN1ujE92\ntO8HItgTp37XT8bJBAiAnt5mxw+NLSqtxk2QdQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEDDCCAvSgAwIBAgICY4kwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTMyMDEx\nNDJaFw0yNDA4MjIxNzA4NTBaMIGZMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEqMCgGA1UEAwwhQW1h\nem9uIFJEUyBhcC1zb3V0aGVhc3QtMSAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAr5u9OuLL/OF/fBNUX2kINJLzFl4DnmrhnLuSeSnBPgbb\nqddjf5EFFJBfv7IYiIWEFPDbDG5hoBwgMup5bZDbas+ZTJTotnnxVJTQ6wlhTmns\neHECcg2pqGIKGrxZfbQhlj08/4nNAPvyYCTS0bEcmQ1emuDPyvJBYDDLDU6AbCB5\n6Z7YKFQPTiCBblvvNzchjLWF9IpkqiTsPHiEt21sAdABxj9ityStV3ja/W9BfgxH\nwzABSTAQT6FbDwmQMo7dcFOPRX+hewQSic2Rn1XYjmNYzgEHisdUsH7eeXREAcTw\n61TRvaLH8AiOWBnTEJXPAe6wYfrcSd1pD0MXpoB62wIDAQABo2YwZDAOBgNVHQ8B\nAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUytwMiomQOgX5\nIchd+2lDWRUhkikwHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJ\nKoZIhvcNAQELBQADggEBACf6lRDpfCD7BFRqiWM45hqIzffIaysmVfr+Jr+fBTjP\nuYe/ba1omSrNGG23bOcT9LJ8hkQJ9d+FxUwYyICQNWOy6ejicm4z0C3VhphbTPqj\nyjpt9nG56IAcV8BcRJh4o/2IfLNzC/dVuYJV8wj7XzwlvjysenwdrJCoLadkTr1h\neIdG6Le07sB9IxrGJL9e04afk37h7c8ESGSE4E+oS4JQEi3ATq8ne1B9DQ9SasXi\nIRmhNAaISDzOPdyLXi9N9V9Lwe/DHcja7hgLGYx3UqfjhLhOKwp8HtoZORixAmOI\nHfILgNmwyugAbuZoCazSKKBhQ0wgO0WZ66ZKTMG8Oho=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBzCCAu+gAwIBAgICUYkwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTYxODIx\nMTVaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\nem9uIFJEUyB1cy13ZXN0LTIgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBANCEZBZyu6yJQFZBJmSUZfSZd3Ui2gitczMKC4FLr0QzkbxY+cLa\nuVONIOrPt4Rwi+3h/UdnUg917xao3S53XDf1TDMFEYp4U8EFPXqCn/GXBIWlU86P\nPvBN+gzw3nS+aco7WXb+woTouvFVkk8FGU7J532llW8o/9ydQyDIMtdIkKTuMfho\nOiNHSaNc+QXQ32TgvM9A/6q7ksUoNXGCP8hDOkSZ/YOLiI5TcdLh/aWj00ziL5bj\npvytiMZkilnc9dLY9QhRNr0vGqL0xjmWdoEXz9/OwjmCihHqJq+20MJPsvFm7D6a\n2NKybR9U+ddrjb8/iyLOjURUZnj5O+2+OPcCAwEAAaNmMGQwDgYDVR0PAQH/BAQD\nAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFEBxMBdv81xuzqcK5TVu\npHj+Aor8MB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\nDQEBCwUAA4IBAQBZkfiVqGoJjBI37aTlLOSjLcjI75L5wBrwO39q+B4cwcmpj58P\n3sivv+jhYfAGEbQnGRzjuFoyPzWnZ1DesRExX+wrmHsLLQbF2kVjLZhEJMHF9eB7\nGZlTPdTzHErcnuXkwA/OqyXMpj9aghcQFuhCNguEfnROY9sAoK2PTfnTz9NJHL+Q\nUpDLEJEUfc0GZMVWYhahc0x38ZnSY2SKacIPECQrTI0KpqZv/P+ijCEcMD9xmYEb\njL4en+XKS1uJpw5fIU5Sj0MxhdGstH6S84iAE5J3GM3XHklGSFwwqPYvuTXvANH6\nuboynxRgSae59jIlAK6Jrr6GWMwQRbgcaAlW\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEDDCCAvSgAwIBAgICEkYwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTYxOTUz\nNDdaFw0yNDA4MjIxNzA4NTBaMIGZMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEqMCgGA1UEAwwhQW1h\nem9uIFJEUyBhcC1zb3V0aGVhc3QtMiAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAufodI2Flker8q7PXZG0P0vmFSlhQDw907A6eJuF/WeMo\nGHnll3b4S6nC3oRS3nGeRMHbyU2KKXDwXNb3Mheu+ox+n5eb/BJ17eoj9HbQR1cd\ngEkIciiAltf8gpMMQH4anP7TD+HNFlZnP7ii3geEJB2GGXSxgSWvUzH4etL67Zmn\nTpGDWQMB0T8lK2ziLCMF4XAC/8xDELN/buHCNuhDpxpPebhct0T+f6Arzsiswt2j\n7OeNeLLZwIZvVwAKF7zUFjC6m7/VmTQC8nidVY559D6l0UhhU0Co/txgq3HVsMOH\nPbxmQUwJEKAzQXoIi+4uZzHFZrvov/nDTNJUhC6DqwIDAQABo2YwZDAOBgNVHQ8B\nAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUwaZpaCme+EiV\nM5gcjeHZSTgOn4owHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJ\nKoZIhvcNAQELBQADggEBAAR6a2meCZuXO2TF9bGqKGtZmaah4pH2ETcEVUjkvXVz\nsl+ZKbYjrun+VkcMGGKLUjS812e7eDF726ptoku9/PZZIxlJB0isC/0OyixI8N4M\nNsEyvp52XN9QundTjkl362bomPnHAApeU0mRbMDRR2JdT70u6yAzGLGsUwMkoNnw\n1VR4XKhXHYGWo7KMvFrZ1KcjWhubxLHxZWXRulPVtGmyWg/MvE6KF+2XMLhojhUL\n+9jB3Fpn53s6KMx5tVq1x8PukHmowcZuAF8k+W4gk8Y68wIwynrdZrKRyRv6CVtR\nFZ8DeJgoNZT3y/GT254VqMxxfuy2Ccb/RInd16tEvVk=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEDDCCAvSgAwIBAgICOYIwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTcyMDA1\nMjlaFw0yNDA4MjIxNzA4NTBaMIGZMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEqMCgGA1UEAwwhQW1h\nem9uIFJEUyBhcC1ub3J0aGVhc3QtMyAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEA4dMak8W+XW8y/2F6nRiytFiA4XLwePadqWebGtlIgyCS\nkbug8Jv5w7nlMkuxOxoUeD4WhI6A9EkAn3r0REM/2f0aYnd2KPxeqS2MrtdxxHw1\nxoOxk2x0piNSlOz6yog1idsKR5Wurf94fvM9FdTrMYPPrDabbGqiBMsZZmoHLvA3\nZ+57HEV2tU0Ei3vWeGIqnNjIekS+E06KhASxrkNU5vi611UsnYZlSi0VtJsH4UGV\nLhnHl53aZL0YFO5mn/fzuNG/51qgk/6EFMMhaWInXX49Dia9FnnuWXwVwi6uX1Wn\n7kjoHi5VtmC8ZlGEHroxX2DxEr6bhJTEpcLMnoQMqwIDAQABo2YwZDAOBgNVHQ8B\nAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUsUI5Cb3SWB8+\ngv1YLN/ABPMdxSAwHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJ\nKoZIhvcNAQELBQADggEBAJAF3E9PM1uzVL8YNdzb6fwJrxxqI2shvaMVmC1mXS+w\nG0zh4v2hBZOf91l1EO0rwFD7+fxoI6hzQfMxIczh875T6vUXePKVOCOKI5wCrDad\nzQbVqbFbdhsBjF4aUilOdtw2qjjs9JwPuB0VXN4/jY7m21oKEOcnpe36+7OiSPjN\nxngYewCXKrSRqoj3mw+0w/+exYj3Wsush7uFssX18av78G+ehKPIVDXptOCP/N7W\n8iKVNeQ2QGTnu2fzWsGUSvMGyM7yqT+h1ILaT//yQS8er511aHMLc142bD4D9VSy\nDgactwPDTShK/PXqhvNey9v/sKXm4XatZvwcc8KYlW4=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEDDCCAvSgAwIBAgICcEUwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTgxNjU2\nMjBaFw0yNDA4MjIxNzA4NTBaMIGZMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEqMCgGA1UEAwwhQW1h\nem9uIFJEUyBhcC1ub3J0aGVhc3QtMSAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAndtkldmHtk4TVQAyqhAvtEHSMb6pLhyKrIFved1WO3S7\n+I+bWwv9b2W/ljJxLq9kdT43bhvzonNtI4a1LAohS6bqyirmk8sFfsWT3akb+4Sx\n1sjc8Ovc9eqIWJCrUiSvv7+cS7ZTA9AgM1PxvHcsqrcUXiK3Jd/Dax9jdZE1e15s\nBEhb2OEPE+tClFZ+soj8h8Pl2Clo5OAppEzYI4LmFKtp1X/BOf62k4jviXuCSst3\nUnRJzE/CXtjmN6oZySVWSe0rQYuyqRl6//9nK40cfGKyxVnimB8XrrcxUN743Vud\nQQVU0Esm8OVTX013mXWQXJHP2c0aKkog8LOga0vobQIDAQABo2YwZDAOBgNVHQ8B\nAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQULmoOS1mFSjj+\nsnUPx4DgS3SkLFYwHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJ\nKoZIhvcNAQELBQADggEBAAkVL2P1M2/G9GM3DANVAqYOwmX0Xk58YBHQu6iiQg4j\nb4Ky/qsZIsgT7YBsZA4AOcPKQFgGTWhe9pvhmXqoN3RYltN8Vn7TbUm/ZVDoMsrM\ngwv0+TKxW1/u7s8cXYfHPiTzVSJuOogHx99kBW6b2f99GbP7O1Sv3sLq4j6lVvBX\nFiacf5LAWC925nvlTzLlBgIc3O9xDtFeAGtZcEtxZJ4fnGXiqEnN4539+nqzIyYq\nnvlgCzyvcfRAxwltrJHuuRu6Maw5AGcd2Y0saMhqOVq9KYKFKuD/927BTrbd2JVf\n2sGWyuPZPCk3gq+5pCjbD0c6DkhcMGI6WwxvM5V/zSM=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBzCCAu+gAwIBAgICJDQwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTgxNzAz\nMTVaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\nem9uIFJEUyBldS13ZXN0LTMgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAL9bL7KE0n02DLVtlZ2PL+g/BuHpMYFq2JnE2RgompGurDIZdjmh\n1pxfL3nT+QIVMubuAOy8InRfkRxfpxyjKYdfLJTPJG+jDVL+wDcPpACFVqoV7Prg\npVYEV0lc5aoYw4bSeYFhdzgim6F8iyjoPnObjll9mo4XsHzSoqJLCd0QC+VG9Fw2\nq+GDRZrLRmVM2oNGDRbGpGIFg77aRxRapFZa8SnUgs2AqzuzKiprVH5i0S0M6dWr\ni+kk5epmTtkiDHceX+dP/0R1NcnkCPoQ9TglyXyPdUdTPPRfKCq12dftqll+u4mV\nARdN6WFjovxax8EAP2OAUTi1afY+1JFMj+sCAwEAAaNmMGQwDgYDVR0PAQH/BAQD\nAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLfhrbrO5exkCVgxW0x3\nY2mAi8lNMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\nDQEBCwUAA4IBAQAigQ5VBNGyw+OZFXwxeJEAUYaXVoP/qrhTOJ6mCE2DXUVEoJeV\nSxScy/TlFA9tJXqmit8JH8VQ/xDL4ubBfeMFAIAo4WzNWDVoeVMqphVEcDWBHsI1\nAETWzfsapRS9yQekOMmxg63d/nV8xewIl8aNVTHdHYXMqhhik47VrmaVEok1UQb3\nO971RadLXIEbVd9tjY5bMEHm89JsZDnDEw1hQXBb67Elu64OOxoKaHBgUH8AZn/2\nzFsL1ynNUjOhCSAA15pgd1vjwc0YsBbAEBPcHBWYBEyME6NLNarjOzBl4FMtATSF\nwWCKRGkvqN8oxYhwR2jf2rR5Mu4DWkK5Q8Ep\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBzCCAu+gAwIBAgICJVUwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTkxODE2\nNTNaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\nem9uIFJEUyB1cy1lYXN0LTEgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAM3i/k2u6cqbMdcISGRvh+m+L0yaSIoOXjtpNEoIftAipTUYoMhL\nInXGlQBVA4shkekxp1N7HXe1Y/iMaPEyb3n+16pf3vdjKl7kaSkIhjdUz3oVUEYt\ni8Z/XeJJ9H2aEGuiZh3kHixQcZczn8cg3dA9aeeyLSEnTkl/npzLf//669Ammyhs\nXcAo58yvT0D4E0D/EEHf2N7HRX7j/TlyWvw/39SW0usiCrHPKDLxByLojxLdHzso\nQIp/S04m+eWn6rmD+uUiRteN1hI5ncQiA3wo4G37mHnUEKo6TtTUh+sd/ku6a8HK\nglMBcgqudDI90s1OpuIAWmuWpY//8xEG2YECAwEAAaNmMGQwDgYDVR0PAQH/BAQD\nAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFPqhoWZcrVY9mU7tuemR\nRBnQIj1jMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\nDQEBCwUAA4IBAQB6zOLZ+YINEs72heHIWlPZ8c6WY8MDU+Be5w1M+BK2kpcVhCUK\nPJO4nMXpgamEX8DIiaO7emsunwJzMSvavSPRnxXXTKIc0i/g1EbiDjnYX9d85DkC\nE1LaAUCmCZBVi9fIe0H2r9whIh4uLWZA41oMnJx/MOmo3XyMfQoWcqaSFlMqfZM4\n0rNoB/tdHLNuV4eIdaw2mlHxdWDtF4oH+HFm+2cVBUVC1jXKrFv/euRVtsTT+A6i\nh2XBHKxQ1Y4HgAn0jACP2QSPEmuoQEIa57bEKEcZsBR8SDY6ZdTd2HLRIApcCOSF\nMRM8CKLeF658I0XgF8D5EsYoKPsA+74Z+jDH\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEETCCAvmgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSUwIwYDVQQDDBxBbWF6b24gUkRTIEJldGEgUm9vdCAyMDE5IENBMB4XDTE5MDgy\nMDE3MTAwN1oXDTI0MDgxOTE3MzgyNlowgZkxCzAJBgNVBAYTAlVTMRMwEQYDVQQI\nDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMSIwIAYDVQQKDBlBbWF6b24g\nV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMSowKAYDVQQD\nDCFBbWF6b24gUkRTIEJldGEgdXMtZWFzdC0xIDIwMTkgQ0EwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQDTNCOlotQcLP8TP82U2+nk0bExVuuMVOgFeVMx\nvbUHZQeIj9ikjk+jm6eTDnnkhoZcmJiJgRy+5Jt69QcRbb3y3SAU7VoHgtraVbxF\nQDh7JEHI9tqEEVOA5OvRrDRcyeEYBoTDgh76ROco2lR+/9uCvGtHVrMCtG7BP7ZB\nsSVNAr1IIRZZqKLv2skKT/7mzZR2ivcw9UeBBTUf8xsfiYVBvMGoEsXEycjYdf6w\nWV+7XS7teNOc9UgsFNN+9AhIBc1jvee5E//72/4F8pAttAg/+mmPUyIKtekNJ4gj\nOAR2VAzGx1ybzWPwIgOudZFHXFduxvq4f1hIRPH0KbQ/gkRrAgMBAAGjZjBkMA4G\nA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTkvpCD\n6C43rar9TtJoXr7q8dkrrjAfBgNVHSMEGDAWgBStoQwVpbGx87fxB3dEGDqKKnBT\n4TANBgkqhkiG9w0BAQsFAAOCAQEAJd9fOSkwB3uVdsS+puj6gCER8jqmhd3g/J5V\nZjk9cKS8H0e8pq/tMxeJ8kpurPAzUk5RkCspGt2l0BSwmf3ahr8aJRviMX6AuW3/\ng8aKplTvq/WMNGKLXONa3Sq8591J+ce8gtOX/1rDKmFI4wQ/gUzOSYiT991m7QKS\nFr6HMgFuz7RNJbb3Fy5cnurh8eYWA7mMv7laiLwTNsaro5qsqErD5uXuot6o9beT\na+GiKinEur35tNxAr47ax4IRubuIzyfCrezjfKc5raVV2NURJDyKP0m0CCaffAxE\nqn2dNfYc3v1D8ypg3XjHlOzRo32RB04o8ALHMD9LSwsYDLpMag==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEFzCCAv+gAwIBAgICFSUwDQYJKoZIhvcNAQELBQAwgZcxCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSgwJgYDVQQDDB9BbWF6b24gUkRTIFByZXZpZXcgUm9vdCAyMDE5IENBMB4XDTE5\nMDgyMTIyMzk0N1oXDTI0MDgyMTIyMjk0OVowgZwxCzAJBgNVBAYTAlVTMRMwEQYD\nVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMSIwIAYDVQQKDBlBbWF6\nb24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMS0wKwYD\nVQQDDCRBbWF6b24gUkRTIFByZXZpZXcgdXMtZWFzdC0yIDIwMTkgQ0EwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD0dB/U7qRnSf05wOi7m10Pa2uPMTJv\nr6U/3Y17a5prq5Zr4++CnSUYarG51YuIf355dKs+7Lpzs782PIwCmLpzAHKWzix6\npOaTQ+WZ0+vUMTxyqgqWbsBgSCyP7pVBiyqnmLC/L4az9XnscrbAX4pNaoJxsuQe\nmzBo6yofjQaAzCX69DuqxFkVTRQnVy7LCFkVaZtjNAftnAHJjVgQw7lIhdGZp9q9\nIafRt2gteihYfpn+EAQ/t/E4MnhrYs4CPLfS7BaYXBycEKC5Muj1l4GijNNQ0Efo\nxG8LSZz7SNgUvfVwiNTaqfLP3AtEAWiqxyMyh3VO+1HpCjT7uNBFtmF3AgMBAAGj\nZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQW\nBBQtinkdrj+0B2+qdXngV2tgHnPIujAfBgNVHSMEGDAWgBRp0xqULkNh/w2ZVzEI\no2RIY7O03TANBgkqhkiG9w0BAQsFAAOCAQEAtJdqbCxDeMc8VN1/RzCabw9BIL/z\n73Auh8eFTww/sup26yn8NWUkfbckeDYr1BrXa+rPyLfHpg06kwR8rBKyrs5mHwJx\nbvOzXD/5WTdgreB+2Fb7mXNvWhenYuji1MF+q1R2DXV3I05zWHteKX6Dajmx+Uuq\nYq78oaCBSV48hMxWlp8fm40ANCL1+gzQ122xweMFN09FmNYFhwuW+Ao+Vv90ZfQG\nPYwTvN4n/gegw2TYcifGZC2PNX74q3DH03DXe5fvNgRW5plgz/7f+9mS+YHd5qa9\ntYTPUvoRbi169ou6jicsMKUKPORHWhiTpSCWR1FMMIbsAcsyrvtIsuaGCQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/jCCAuagAwIBAgIQdOCSuA9psBpQd8EI368/0DANBgkqhkiG9w0BAQsFADCB\nlzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\nbWF6b24gUkRTIHNhLWVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTE5MTgwNjI2WhgPMjA2MTA1MTkxOTA2MjZaMIGXMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\nbiBSRFMgc2EtZWFzdC0xIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN6ftL6w8v3dB2yW\nLjCxSP1D7ZsOTeLZOSCz1Zv0Gkd0XLhil5MdHOHBvwH/DrXqFU2oGzCRuAy+aZis\nDardJU6ChyIQIciXCO37f0K23edhtpXuruTLLwUwzeEPdcnLPCX+sWEn9Y5FPnVm\npCd6J8edH2IfSGoa9LdErkpuESXdidLym/w0tWG/O2By4TabkNSmpdrCL00cqI+c\nprA8Bx1jX8/9sY0gpAovtuFaRN+Ivg3PAnWuhqiSYyQ5nC2qDparOWuDiOhpY56E\nEgmTvjwqMMjNtExfYx6Rv2Ndu50TriiNKEZBzEtkekwXInTupmYTvc7U83P/959V\nUiQ+WSMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU4uYHdH0+\nbUeh81Eq2l5/RJbW+vswDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IB\nAQBhxcExJ+w74bvDknrPZDRgTeMLYgbVJjx2ExH7/Ac5FZZWcpUpFwWMIJJxtewI\nAnhryzM3tQYYd4CG9O+Iu0+h/VVfW7e4O3joWVkxNMb820kQSEwvZfA78aItGwOY\nWSaFNVRyloVicZRNJSyb1UL9EiJ9ldhxm4LTT0ax+4ontI7zTx6n6h8Sr6r/UOvX\nd9T5aUUENWeo6M9jGupHNn3BobtL7BZm2oS8wX8IVYj4tl0q5T89zDi2x0MxbsIV\n5ZjwqBQ5JWKv7ASGPb+z286RjPA9R2knF4lJVZrYuNV90rHvI/ECyt/JrDqeljGL\nBLl1W/UsvZo6ldLIpoMbbrb5\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBDCCAuygAwIBAgIQUfVbqapkLYpUqcLajpTJWzANBgkqhkiG9w0BAQsFADCB\nmjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\nbWF6b24gUkRTIG1lLWNlbnRyYWwtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNV\nBAcMB1NlYXR0bGUwIBcNMjIwNTA2MjMyMDA5WhgPMjA2MjA1MDcwMDIwMDlaMIGa\nMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5j\nLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMzAxBgNVBAMMKkFt\nYXpvbiBSRFMgbWUtY2VudHJhbC0xIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UE\nBwwHU2VhdHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJIeovu3\newI9FVitXMQzvkh34aQ6WyI4NO3YepfJaePiv3cnyFGYHN2S1cR3UQcLWgypP5va\nj6bfroqwGbCbZZcb+6cyOB4ceKO9Ws1UkcaGHnNDcy5gXR7aCW2OGTUfinUuhd2d\n5bOGgV7JsPbpw0bwJ156+MwfOK40OLCWVbzy8B1kITs4RUPNa/ZJnvIbiMu9rdj4\n8y7GSFJLnKCjlOFUkNI5LcaYvI1+ybuNgphT3nuu5ZirvTswGakGUT/Q0J3dxP0J\npDfg5Sj/2G4gXiaM0LppVOoU5yEwVewhQ250l0eQAqSrwPqAkdTg9ng360zqCFPE\nJPPcgI1tdGUgneECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU\n/2AJVxWdZxc8eJgdpbwpW7b0f7IwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\nCwUAA4IBAQBYm63jTu2qYKJ94gKnqc+oUgqmb1mTXmgmp/lXDbxonjszJDOXFbri\n3CCO7xB2sg9bd5YWY8sGKHaWmENj3FZpCmoefbUx++8D7Mny95Cz8R32rNcwsPTl\nebpd9A/Oaw5ug6M0x/cNr0qzF8Wk9Dx+nFEimp8RYQdKvLDfNFZHjPa1itnTiD8M\nTorAqj+VwnUGHOYBsT/0NY12tnwXdD+ATWfpEHdOXV+kTMqFFwDyhfgRVNpTc+os\nygr8SwhnSCpJPB/EYl2S7r+tgAbJOkuwUvGT4pTqrzDQEhwE7swgepnHC87zhf6l\nqN6mVpSnQKQLm6Ob5TeCEFgcyElsF5bH\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjSgAwIBAgIRAOxu0I1QuMAhIeszB3fJIlkwCgYIKoZIzj0EAwMwgZYx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\nem9uIFJEUyB1cy13ZXN0LTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTI0MjIwNjU5WhgPMjEyMTA1MjQyMzA2NTlaMIGWMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\nRFMgdXMtd2VzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEz4bylRcGqqDWdP7gQIIoTHdBK6FNtKH1\n4SkEIXRXkYDmRvL9Bci1MuGrwuvrka5TDj4b7e+csY0llEzHpKfq6nJPFljoYYP9\nuqHFkv77nOpJJ633KOr8IxmeHW5RXgrZo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\nA1UdDgQWBBQQikVz8wmjd9eDFRXzBIU8OseiGzAOBgNVHQ8BAf8EBAMCAYYwCgYI\nKoZIzj0EAwMDaAAwZQIwf06Mcrpw1O0EBLBBrp84m37NYtOkE/0Z0O+C7D41wnXi\nEQdn6PXUVgdD23Gj82SrAjEAklhKs+liO1PtN15yeZR1Io98nFve+lLptaLakZcH\n+hfFuUtCqMbaI8CdvJlKnPqT\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGCTCCA/GgAwIBAgIRALyWMTyCebLZOGcZZQmkmfcwDQYJKoZIhvcNAQEMBQAw\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBhcC1ub3J0aGVhc3QtMyBSb290IENBIFJTQTQwOTYgRzExEDAO\nBgNVBAcMB1NlYXR0bGUwIBcNMjEwNTI0MjAyODAzWhgPMjEyMTA1MjQyMTI4MDNa\nMIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\nSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\nLEFtYXpvbiBSRFMgYXAtbm9ydGhlYXN0LTMgUm9vdCBDQSBSU0E0MDk2IEcxMRAw\nDgYDVQQHDAdTZWF0dGxlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA\nwGFiyDyCrGqgdn4fXG12cxKAAfVvhMea1mw5h9CVRoavkPqhzQpAitSOuMB9DeiP\nwQyqcsiGl/cTEau4L+AUBG8b9v26RlY48exUYBXj8CieYntOT9iNw5WtdYJa3kF/\nJxgI+HDMzE9cmHDs5DOO3S0uwZVyra/xE1ymfSlpOeUIOTpHRJv97CBUEpaZMUW5\nSr6GruuOwFVpO5FX3A/jQlcS+UN4GjSRgDUJuqg6RRQldEZGCVCCmodbByvI2fGm\nreGpsPJD54KkmAX08nOR8e5hkGoHxq0m2DLD4SrOFmt65vG47qnuwplWJjtk9B3Z\n9wDoopwZLBOtlkPIkUllWm1P8EuHC1IKOA+wSP6XdT7cy8S77wgyHzR0ynxv7q/l\nvlZtH30wnNqFI0y9FeogD0TGMCHcnGqfBSicJXPy9T4fU6f0r1HwqKwPp2GArwe7\ndnqLTj2D7M9MyVtFjEs6gfGWXmu1y5uDrf+CszurE8Cycoma+OfjjuVQgWOCy7Nd\njJswPxAroTzVfpgoxXza4ShUY10woZu0/J+HmNmqK7lh4NS75q1tz75in8uTZDkV\nbe7GK+SEusTrRgcf3tlgPjSTWG3veNzFDF2Vn1GLJXmuZfhdlVQDBNXW4MNREExS\ndG57kJjICpT+r8X+si+5j51gRzkSnMYs7VHulpxfcwECAwEAAaNCMEAwDwYDVR0T\nAQH/BAUwAwEB/zAdBgNVHQ4EFgQU4JWOpDBmUBuWKvGPZelw87ezhL8wDgYDVR0P\nAQH/BAQDAgGGMA0GCSqGSIb3DQEBDAUAA4ICAQBRNLMql7itvXSEFQRAnyOjivHz\nl5IlWVQjAbOUr6ogZcwvK6YpxNAFW5zQr8F+fdkiypLz1kk5irx9TIpff0BWC9hQ\n/odMPO8Gxn8+COlSvc+dLsF2Dax3Hvz0zLeKMo+cYisJOzpdR/eKd0/AmFdkvQoM\nAOK9n0yYvVJU2IrSgeJBiiCarpKSeAktEVQ4rvyacQGr+QAPkkjRwm+5LHZKK43W\nnNnggRli9N/27qYtc5bgr3AaQEhEXMI4RxPRXCLsod0ehMGWyRRK728a+6PMMJAJ\nWHOU0x7LCEMPP/bvpLj3BdvSGqNor4ZtyXEbwREry1uzsgODeRRns5acPwTM6ff+\nCmxO2NZ0OktIUSYRmf6H/ZFlZrIhV8uWaIwEJDz71qvj7buhQ+RFDZ9CNL64C0X6\nmf0zJGEpddjANHaaVky+F4gYMtEy2K2Lcm4JGTdyIzUoIe+atzCnRp0QeIcuWtF+\ns8AjDYCVFNypcMmqbRmNpITSnOoCHSRuVkY3gutVoYyMLbp8Jm9SJnCIlEWTA6Rm\nwADOMGZJVn5/XRTRuetVOB3KlQDjs9OO01XN5NzGSZO2KT9ngAUfh9Eqhf1iRWSP\nnZlRbQ2NRCuY/oJ5N59mLGxnNJSE7giEKEBRhTQ/XEPIUYAUPD5fca0arKRJwbol\nl9Se1Hsq0ZU5f+OZKQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\n5zT5+Bs=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nHing\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgIRANxgyBbnxgTEOpDul2ZnC0UwDQYJKoZIhvcNAQELBQAw\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtMyBSb290IENBIFJTQTIwNDggRzExEDAO\nBgNVBAcMB1NlYXR0bGUwIBcNMjEwNjEwMTgxOTA3WhgPMjA2MTA2MTAxOTE5MDda\nMIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\nSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\nLEFtYXpvbiBSRFMgYXAtc291dGhlYXN0LTMgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\nDgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nxnwSDAChrMkfk5TA4Dk8hKzStDlSlONzmd3fTG0Wqr5+x3EmFT6Ksiu/WIwEl9J2\nK98UI7vYyuZfCxUKb1iMPeBdVGqk0zb92GpURd+Iz/+K1ps9ZLeGBkzR8mBmAi1S\nOfpwKiTBzIv6E8twhEn4IUpHsdcuX/2Y78uESpJyM8O5CpkG0JaV9FNEbDkJeBUQ\nAo2qqNcH4R0Qcr5pyeqA9Zto1RswgL06BQMI9dTpfwSP5VvkvcNUaLl7Zv5WzLQE\nJzORWePvdPzzvWEkY/3FPjxBypuYwssKaERW0fkPDmPtykktP9W/oJolKUFI6pXp\ny+Y6p6/AVdnQD2zZjW5FhQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\nDgQWBBT+jEKs96LC+/X4BZkUYUkzPfXdqTAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\nhvcNAQELBQADggEBAIGQqgqcQ6XSGkmNebzR6DhadTbfDmbYeN5N0Vuzv+Tdmufb\ntMGjdjnYMg4B+IVnTKQb+Ox3pL9gbX6KglGK8HupobmIRtwKVth+gYYz3m0SL/Nk\nhaWPYzOm0x3tJm8jSdufJcEob4/ATce9JwseLl76pSWdl5A4lLjnhPPKudUDfH+1\nBLNUi3lxpp6GkC8aWUPtupnhZuXddolTLOuA3GwTZySI44NfaFRm+o83N1jp+EwD\n6e94M4cTRzjUv6J3MZmSbdtQP/Tk1uz2K4bQZGP0PZC3bVpqiesdE/xr+wbu8uHr\ncM1JXH0AmXf1yIkTgyWzmvt0k1/vgcw5ixAqvvE=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEATCCAumgAwIBAgIRAMhw98EQU18mIji+unM2YH8wDQYJKoZIhvcNAQELBQAw\ngZgxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwo\nQW1hem9uIFJEUyBhcC1zb3V0aC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UE\nBwwHU2VhdHRsZTAgFw0yMjA2MDYyMTQyMjJaGA8yMDYyMDYwNjIyNDIyMlowgZgx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwoQW1h\nem9uIFJEUyBhcC1zb3V0aC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwH\nU2VhdHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIeeRoLfTm+7\nvqm7ZlFSx+1/CGYHyYrOOryM4/Z3dqYVHFMgWTR7V3ziO8RZ6yUanrRcWVX3PZbF\nAfX0KFE8OgLsXEZIX8odSrq86+/Th5eZOchB2fDBsUB7GuN2rvFBbM8lTI9ivVOU\nlbuTnYyb55nOXN7TpmH2bK+z5c1y9RVC5iQsNAl6IJNvSN8VCqXh31eK5MlKB4DT\n+Y3OivCrSGsjM+UR59uZmwuFB1h+icE+U0p9Ct3Mjq3MzSX5tQb6ElTNGlfmyGpW\nKh7GQ5XU1KaKNZXoJ37H53woNSlq56bpVrKI4uv7ATpdpFubOnSLtpsKlpLdR3sy\nWs245200pC8CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUp0ki\n6+eWvsnBjQhMxwMW5pwn7DgwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUA\nA4IBAQB2V8lv0aqbYQpj/bmVv/83QfE4vOxKCJAHv7DQ35cJsTyBdF+8pBczzi3t\n3VNL5IUgW6WkyuUOWnE0eqAFOUVj0yTS1jSAtfl3vOOzGJZmWBbqm9BKEdu1D8O6\nsB8bnomwiab2tNDHPmUslpdDqdabbkWwNWzLJ97oGFZ7KNODMEPXWKWNxg33iHfS\n/nlmnrTVI3XgaNK9qLZiUrxu9Yz5gxi/1K+sG9/Dajd32ZxjRwDipOLiZbiXQrsd\nqzIMY4GcWf3g1gHL5mCTfk7dG22h/rhPyGV0svaDnsb+hOt6sv1McMN6Y3Ou0mtM\n/UaAXojREmJmTSCNvs2aBny3/2sy\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjSgAwIBAgIRAMnRxsKLYscJV8Qv5pWbL7swCgYIKoZIzj0EAwMwgZYx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\nem9uIFJEUyBzYS1lYXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTE5MTgxNjAxWhgPMjEyMTA1MTkxOTE2MDFaMIGWMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\nRFMgc2EtZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEjFOCZgTNVKxLKhUxffiDEvTLFhrmIqdO\ndKqVdgDoELEzIHWDdC+19aDPitbCYtBVHl65ITu/9pn6mMUl5hhUNtfZuc6A+Iw1\nsBe0v0qI3y9Q9HdQYrGgeHDh8M5P7E2ho0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\nA1UdDgQWBBS5L7/8M0TzoBZk39Ps7BkfTB4yJTAOBgNVHQ8BAf8EBAMCAYYwCgYI\nKoZIzj0EAwMDaAAwZQIwI43O0NtWKTgnVv9z0LO5UMZYgSve7GvGTwqktZYCMObE\nrUI4QerXM9D6JwLy09mqAjEAypfkdLyVWtaElVDUyHFkihAS1I1oUxaaDrynLNQK\nOu/Ay+ns+J+GyvyDUjBpVVW1\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF/jCCA+agAwIBAgIQR71Z8lTO5Sj+as2jB7IWXzANBgkqhkiG9w0BAQwFADCB\nlzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\nbWF6b24gUkRTIHVzLXdlc3QtMiBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTI0MjIwMzIwWhgPMjEyMTA1MjQyMzAzMjBaMIGXMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\nbiBSRFMgdXMtd2VzdC0yIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAM977bHIs1WJijrS\nXQMfUOhmlJjr2v0K0UjPl52sE1TJ76H8umo1yR4T7Whkd9IwBHNGKXCJtJmMr9zp\nfB38eLTu+5ydUAXdFuZpRMKBWwPVe37AdJRKqn5beS8HQjd3JXAgGKUNNuE92iqF\nqi2fIqFMpnJXWo0FIW6s2Dl2zkORd7tH0DygcRi7lgVxCsw1BJQhFJon3y+IV8/F\nbnbUXSNSDUnDW2EhvWSD8L+t4eiXYsozhDAzhBvojpxhPH9OB7vqFYw5qxFx+G0t\nlSLX5iWi1jzzc3XyGnB6WInZDVbvnvJ4BGZ+dTRpOCvsoMIn9bz4EQTvu243c7aU\nHbS/kvnCASNt+zk7C6lbmaq0AGNztwNj85Opn2enFciWZVnnJ/4OeefUWQxD0EPp\nSjEd9Cn2IHzkBZrHCg+lWZJQBKbUVS0lLIMSsLQQ6WvR38jY7D2nxM1A93xWxwpt\nZtQnYRCVXH6zt2OwDAFePInWwxUjR5t/wu3XxPgpSfrmTi3WYtr1wFypAJ811e/P\nyBtswWUQ6BNJQvy+KnOEeGfOwmtdDFYR+GOCfvCihzrKJrxOtHIieehR5Iw3cbXG\nsm4pDzfMUVvDDz6C2M6PRlJhhClbatHCjik9hxFYEsAlqtVVK9pxaz9i8hOqSFQq\nkJSQsgWw+oM/B2CyjcSqkSQEu8RLAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8w\nHQYDVR0OBBYEFPmrdxpRRgu3IcaB5BTqlprcKdTsMA4GA1UdDwEB/wQEAwIBhjAN\nBgkqhkiG9w0BAQwFAAOCAgEAVdlxWjPvVKky3kn8ZizeM4D+EsLw9dWLau2UD/ls\nzwDCFoT6euagVeCknrn+YEl7g20CRYT9iaonGoMUPuMR/cdtPL1W/Rf40PSrGf9q\nQuxavWiHLEXOQTCtCaVZMokkvjuuLNDXyZnstgECuiZECTwhexUF4oiuhyGk9o01\nQMaiz4HX4lgk0ozALUvEzaNd9gWEwD2qe+rq9cQMTVq3IArUkvTIftZUaVUMzr0O\ned1+zAsNa9nJhURJ/6anJPJjbQgb5qA1asFcp9UaMT1ku36U3gnR1T/BdgG2jX3X\nUm0UcaGNVPrH1ukInWW743pxWQb7/2sumEEMVh+jWbB18SAyLI4WIh4lkurdifzS\nIuTFp8TEx+MouISFhz/vJDWZ84tqoLVjkEcP6oDypq9lFoEzHDJv3V1CYcIgOusT\nk1jm9P7BXdTG7TYzUaTb9USb6bkqkD9EwJAOSs7DI94aE6rsSws2yAHavjAMfuMZ\nsDAZvkqS2Qg2Z2+CI6wUZn7mzkJXbZoqRjDvChDXEB1mIhzVXhiNW/CR5WKVDvlj\n9v1sdGByh2pbxcLQtVaq/5coM4ANgphoNz3pOYUPWHS+JUrIivBZ+JobjXcxr3SN\n9iDzcu5/FVVNbq7+KN/nvPMngT+gduEN5m+EBjm8GukJymFG0m6BENRA0QSDqZ7k\nzDY=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgIRAK5EYG3iHserxMqgg+0EFjgwDQYJKoZIhvcNAQELBQAw\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBhcC1ub3J0aGVhc3QtMyBSb290IENBIFJTQTIwNDggRzExEDAO\nBgNVBAcMB1NlYXR0bGUwIBcNMjEwNTI0MjAyMzE2WhgPMjA2MTA1MjQyMTIzMTZa\nMIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\nSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\nLEFtYXpvbiBSRFMgYXAtbm9ydGhlYXN0LTMgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\nDgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\ns1L6TtB84LGraLHVC+rGPhLBW2P0oN/91Rq3AnYwqDOuTom7agANwEjvLq7dSRG/\nsIfZsSV/ABTgArZ5sCmLjHFZAo8Kd45yA9byx20RcYtAG8IZl+q1Cri+s0XefzyO\nU6mlfXZkVe6lzjlfXBkrlE/+5ifVbJK4dqOS1t9cWIpgKqv5fbE6Qbq4LVT+5/WM\nVd2BOljuBMGMzdZubqFKFq4mzTuIYfnBm7SmHlZfTdfBYPP1ScNuhpjuzw4n3NCR\nEdU6dQv04Q6th4r7eiOCwbWI9LkmVbvBe3ylhH63lApC7MiiPYLlB13xBubVHVhV\nq1NHoNTi+zA3MN9HWicRxQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\nDgQWBBSuxoqm0/wjNiZLvqv+JlQwsDvTPDAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\nhvcNAQELBQADggEBAFfTK/j5kv90uIbM8VaFdVbr/6weKTwehafT0pAk1bfLVX+7\nuf8oHgYiyKTTl0DFQicXejghXTeyzwoEkWSR8c6XkhD5vYG3oESqmt/RGvvoxz11\nrHHy7yHYu7RIUc3VQG60c4qxXv/1mWySGwVwJrnuyNT9KZXPevu3jVaWOVHEILaK\nHvzQ2YEcWBPmde/zEseO2QeeGF8FL45Q1d66wqIP4nNUd2pCjeTS5SpB0MMx7yi9\nki1OH1pv8tOuIdimtZ7wkdB8+JSZoaJ81b8sRrydRwJyvB88rftuI3YB4WwGuONT\nZezUPsmaoK69B0RChB0ofDpAaviF9V3xOWvVZfo=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\n1axqeKpI0F5SBUPsaVNYY2uNFg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECDCCAvCgAwIBAgIQCREfzzVyDTMcNME+gWnTCTANBgkqhkiG9w0BAQsFADCB\nnDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTUwMwYDVQQDDCxB\nbWF6b24gUkRTIGFwLXNvdXRoZWFzdC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4G\nA1UEBwwHU2VhdHRsZTAgFw0yMTA1MjQyMDQyMzNaGA8yMDYxMDUyNDIxNDIzM1ow\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAO\nBgNVBAcMB1NlYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDL\n1MT6br3L/4Pq87DPXtcjlXN3cnbNk2YqRAZHJayStTz8VtsFcGPJOpk14geRVeVk\ne9uKFHRbcyr/RM4owrJTj5X4qcEuATYZbo6ou/rW2kYzuWFZpFp7lqm0vasV4Z9F\nfChlhwkNks0UbM3G+psCSMNSoF19ERunj7w2c4E62LwujkeYLvKGNepjnaH10TJL\n2krpERd+ZQ4jIpObtRcMH++bTrvklc+ei8W9lqrVOJL+89v2piN3Ecdd389uphst\nqQdb1BBVXbhUrtuGHgVf7zKqN1SkCoktoWxVuOprVWhSvr7akaWeq0UmlvbEsujU\nvADqxGMcJFyCzxx3CkJjAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O\nBBYEFFk8UJmlhoxFT3PP12PvhvazHjT4MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG\n9w0BAQsFAAOCAQEAfFtr2lGoWVXmWAsIo2NYre7kzL8Xb9Tx7desKxCCz5HOOvIr\n8JMB1YK6A7IOvQsLJQ/f1UnKRh3X3mJZjKIywfrMSh0FiDf+rjcEzXxw2dGtUem4\nA+WMvIA3jwxnJ90OQj5rQ8bg3iPtE6eojzo9vWQGw/Vu48Dtw1DJo9210Lq/6hze\nhPhNkFh8fMXNT7Q1Wz/TJqJElyAQGNOXhyGpHKeb0jHMMhsy5UNoW5hLeMS5ffao\nTBFWEJ1gVfxIU9QRxSh+62m46JIg+dwDlWv8Aww14KgepspRbMqDuaM2cinoejv6\nt3dyOyHHrsOyv3ffZUKtQhQbQr+sUcL89lARsg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/zCCAuegAwIBAgIRAIJLTMpzGNxqHZ4t+c1MlCIwDQYJKoZIhvcNAQELBQAw\ngZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\nQW1hem9uIFJEUyBhcC1lYXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyNTIxMzAzM1oYDzIwNjEwNTI1MjIzMDMzWjCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIGFwLWVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtdHut0ZhJ9Nn2\nMpVafFcwHdoEzx06okmmhjJsNy4l9QYVeh0UUoek0SufRNMRF4d5ibzpgZol0Y92\n/qKWNe0jNxhEj6sXyHsHPeYtNBPuDMzThfbvsLK8z7pBP7vVyGPGuppqW/6m4ZBB\nlcc9fsf7xpZ689iSgoyjiT6J5wlVgmCx8hFYc/uvcRtfd8jAHvheug7QJ3zZmIye\nV4htOW+fRVWnBjf40Q+7uTv790UAqs0Zboj4Yil+hER0ibG62y1g71XcCyvcVpto\n2/XW7Y9NCgMNqQ7fGN3wR1gjtSYPd7DO32LTzYhutyvfbpAZjsAHnoObmoljcgXI\nQjfBcCFpAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJI3aWLg\nCS5xqU5WYVaeT5s8lpO0MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\nAQEAUwATpJOcGVOs3hZAgJwznWOoTzOVJKfrqBum7lvkVH1vBwxBl9CahaKj3ZOt\nYYp2qJzhDUWludL164DL4ZjS6eRedLRviyy5cRy0581l1MxPWTThs27z+lCC14RL\nPJZNVYYdl7Jy9Q5NsQ0RBINUKYlRY6OqGDySWyuMPgno2GPbE8aynMdKP+f6G/uE\nYHOf08gFDqTsbyfa70ztgVEJaRooVf5JJq4UQtpDvVswW2reT96qi6tXPKHN5qp3\n3wI0I1Mp4ePmiBKku2dwYzPfrJK/pQlvu0Gu5lKOQ65QdotwLAAoaFqrf9za1yYs\nINUkHLWIxDds+4OHNYcerGp5Dw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGCTCCA/GgAwIBAgIRAIO6ldra1KZvNWJ0TA1ihXEwDQYJKoZIhvcNAQEMBQAw\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtMSBSb290IENBIFJTQTQwOTYgRzExEDAO\nBgNVBAcMB1NlYXR0bGUwIBcNMjEwNTIxMjE0NTA1WhgPMjEyMTA1MjEyMjQ1MDVa\nMIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\nSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\nLEFtYXpvbiBSRFMgYXAtc291dGhlYXN0LTEgUm9vdCBDQSBSU0E0MDk2IEcxMRAw\nDgYDVQQHDAdTZWF0dGxlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA\nsDN52Si9pFSyZ1ruh3xAN0nVqEs960o2IK5CPu/ZfshFmzAwnx/MM8EHt/jMeZtj\nSM58LADAsNDL01ELpFZATjgZQ6xNAyXRXE7RiTRUvNkK7O3o2qAGbLnJq/UqF7Sw\nLRnB8V6hYOv+2EjVnohtGCn9SUFGZtYDjWXsLd4ML4Zpxv0a5LK7oEC7AHzbUR7R\njsjkrXqSv7GE7bvhSOhMkmgxgj1F3J0b0jdQdtyyj109aO0ATUmIvf+Bzadg5AI2\nA9UA+TUcGeebhpHu8AP1Hf56XIlzPpaQv3ZJ4vzoLaVNUC7XKzAl1dlvCl7Klg/C\n84qmbD/tjZ6GHtzpLKgg7kQEV7mRoXq8X4wDX2AFPPQl2fv+Kbe+JODqm5ZjGegm\nuskABBi8IFv1hYx9jEulZPxC6uD/09W2+niFm3pirnlWS83BwVDTUBzF+CooUIMT\njhWkIIZGDDgMJTzouBHfoSJtS1KpUZi99m2WyVs21MNKHeWAbs+zmI6TO5iiMC+T\nuB8spaOiHFO1573Fmeer4sy3YA6qVoqVl6jjTQqOdy3frAMbCkwH22/crV8YA+08\nhLeHXrMK+6XUvU+EtHAM3VzcrLbuYJUI2XJbzTj5g0Eb8I8JWsHvWHR5K7Z7gceR\n78AzxQmoGEfV6KABNWKsgoCQnfb1BidDJIe3BsI0A6UCAwEAAaNCMEAwDwYDVR0T\nAQH/BAUwAwEB/zAdBgNVHQ4EFgQUABp0MlB14MSHgAcuNSOhs3MOlUcwDgYDVR0P\nAQH/BAQDAgGGMA0GCSqGSIb3DQEBDAUAA4ICAQCv4CIOBSQi/QR9NxdRgVAG/pAh\ntFJhV7OWb/wqwsNKFDtg6tTxwaahdCfWpGWId15OUe7G9LoPiKiwM9C92n0ZeHRz\n4ewbrQVo7Eu1JI1wf0rnZJISL72hVYKmlvaWaacHhWxvsbKLrB7vt6Cknxa+S993\nKf8i2Psw8j5886gaxhiUtzMTBwoDWak8ZaK7m3Y6C6hXQk08+3pnIornVSFJ9dlS\nPAqt5UPwWmrEfF+0uIDORlT+cvrAwgSp7nUF1q8iasledycZ/BxFgQqzNwnkBDwQ\nZ/aM52ArGsTzfMhkZRz9HIEhz1/0mJw8gZtDVQroD8778h8zsx2SrIz7eWQ6uWsD\nQEeSWXpcheiUtEfzkDImjr2DLbwbA23c9LoexUD10nwohhoiQQg77LmvBVxeu7WU\nE63JqaYUlOLOzEmNJp85zekIgR8UTkO7Gc+5BD7P4noYscI7pPOL5rP7YLg15ZFi\nega+G53NTckRXz4metsd8XFWloDjZJJq4FfD60VuxgXzoMNT9wpFTNSH42PR2s9L\nI1vcl3w8yNccs9se2utM2nLsItZ3J0m/+QSRiw9hbrTYTcM9sXki0DtH2kyIOwYf\nlOrGJDiYOIrXSQK36H0gQ+8omlrUTvUj4msvkXuQjlfgx6sgp2duOAfnGxE7uHnc\nUhnJzzoe6M+LfGHkVQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICuDCCAj2gAwIBAgIQSAG6j2WHtWUUuLGJTPb1nTAKBggqhkjOPQQDAzCBmzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\nb24gUkRTIGFwLW5vcnRoZWFzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyMDE2MzgyNloYDzIxMjEwNTIwMTczODI2WjCBmzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\nb24gUkRTIGFwLW5vcnRoZWFzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE2eqwU4FOzW8RV1W381Bd\nolhDOrqoMqzWli21oDUt7y8OnXM/lmAuOS6sr8Nt61BLVbONdbr+jgCYw75KabrK\nZGg3siqvMOgabIKkKuXO14wtrGyGDt7dnKXg5ERGYOZlo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MB0GA1UdDgQWBBS1Acp2WYxOcblv5ikZ3ZIbRCCW+zAOBgNVHQ8BAf8E\nBAMCAYYwCgYIKoZIzj0EAwMDaQAwZgIxAJL84J08PBprxmsAKPTotBuVI3MyW1r8\nxQ0i8lgCQUf8GcmYjQ0jI4oZyv+TuYJAcwIxAP9Xpzq0Docxb+4N1qVhpiOfWt1O\nFnemFiy9m1l+wv6p3riQMPV7mBVpklmijkIv3Q==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgIRALZLcqCVIJ25maDPE3sbPCIwDQYJKoZIhvcNAQELBQAw\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAO\nBgNVBAcMB1NlYXR0bGUwIBcNMjEwNTIxMjEzOTM5WhgPMjA2MTA1MjEyMjM5Mzla\nMIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\nSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\nLEFtYXpvbiBSRFMgYXAtc291dGhlYXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\nDgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nypKc+6FfGx6Gl6fQ78WYS29QoKgQiur58oxR3zltWeg5fqh9Z85K5S3UbRSTqWWu\nXcfnkz0/FS07qHX+nWAGU27JiQb4YYqhjZNOAq8q0+ptFHJ6V7lyOqXBq5xOzO8f\n+0DlbJSsy7GEtJp7d7QCM3M5KVY9dENVZUKeJwa8PC5StvwPx4jcLeZRJC2rAVDG\nSW7NAInbATvr9ssSh03JqjXb+HDyywiqoQ7EVLtmtXWimX+0b3/2vhqcH5jgcKC9\nIGFydrjPbv4kwMrKnm6XlPZ9L0/3FMzanXPGd64LQVy51SI4d5Xymn0Mw2kMX8s6\nNf05OsWcDzJ1n6/Q1qHSxQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\nDgQWBBRmaIc8eNwGP7i6P7AJrNQuK6OpFzAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\nhvcNAQELBQADggEBAIBeHfGwz3S2zwIUIpqEEI5/sMySDeS+3nJR+woWAHeO0C8i\nBJdDh+kzzkP0JkWpr/4NWz84/IdYo1lqASd1Kopz9aT1+iROXaWr43CtbzjXb7/X\nZv7eZZFC8/lS5SROq42pPWl4ekbR0w8XGQElmHYcWS41LBfKeHCUwv83ATF0XQ6I\n4t+9YSqZHzj4vvedrvcRInzmwWJaal9s7Z6GuwTGmnMsN3LkhZ+/GD6oW3pU/Pyh\nEtWqffjsLhfcdCs3gG8x9BbkcJPH5aPAVkPn4wc8wuXg6xxb9YGsQuY930GWTYRf\nschbgjsuqznW4HHakq4WNhs1UdTSTKkRdZz7FUQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEDzCCAvegAwIBAgIRAM2zAbhyckaqRim63b+Tib8wDQYJKoZIhvcNAQELBQAw\ngZ8xCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE4MDYGA1UEAwwv\nQW1hem9uIFJEUyBQcmV2aWV3IHVzLWVhc3QtMiBSb290IENBIFJTQTIwNDggRzEx\nEDAOBgNVBAcMB1NlYXR0bGUwIBcNMjEwNTE4MjA0OTQ1WhgPMjA2MTA1MTgyMTQ5\nNDVaMIGfMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\ncywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExODA2BgNV\nBAMML0FtYXpvbiBSRFMgUHJldmlldyB1cy1lYXN0LTIgUm9vdCBDQSBSU0EyMDQ4\nIEcxMRAwDgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEA1ybjQMH1MkbvfKsWJaCTXeCSN1SG5UYid+Twe+TjuSqaXWonyp4WRR5z\ntlkqq+L2MWUeQQAX3S17ivo/t84mpZ3Rla0cx39SJtP3BiA2BwfUKRjhPwOjmk7j\n3zrcJjV5k1vSeLNOfFFSlwyDiVyLAE61lO6onBx+cRjelu0egMGq6WyFVidTdCmT\nQ9Zw3W6LTrnPvPmEyjHy2yCHzH3E50KSd/5k4MliV4QTujnxYexI2eR8F8YQC4m3\nDYjXt/MicbqA366SOoJA50JbgpuVv62+LSBu56FpzY12wubmDZsdn4lsfYKiWxUy\nuc83a2fRXsJZ1d3whxrl20VFtLFHFQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/\nMB0GA1UdDgQWBBRC0ytKmDYbfz0Bz0Psd4lRQV3aNTAOBgNVHQ8BAf8EBAMCAYYw\nDQYJKoZIhvcNAQELBQADggEBAGv8qZu4uaeoF6zsbumauz6ea6tdcWt+hGFuwGrb\ntRbI85ucAmVSX06x59DJClsb4MPhL1XmqO3RxVMIVVfRwRHWOsZQPnXm8OYQ2sny\nrYuFln1COOz1U/KflZjgJmxbn8x4lYiTPZRLarG0V/OsCmnLkQLPtEl/spMu8Un7\nr3K8SkbWN80gg17Q8EV5mnFwycUx9xsTAaFItuG0en9bGsMgMmy+ZsDmTRbL+lcX\nFq8r4LT4QjrFz0shrzCwuuM4GmcYtBSxlacl+HxYEtAs5k10tmzRf6OYlY33tGf6\n1tkYvKryxDPF/EDgGp/LiBwx6ixYMBfISoYASt4V/ylAlHA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICtTCCAjqgAwIBAgIRAK9BSZU6nIe6jqfODmuVctYwCgYIKoZIzj0EAwMwgZkx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEyMDAGA1UEAwwpQW1h\nem9uIFJEUyBjYS1jZW50cmFsLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTIxMjIxMzA5WhgPMjEyMTA1MjEyMzEzMDlaMIGZMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMjAwBgNVBAMMKUFtYXpv\nbiBSRFMgY2EtY2VudHJhbC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdT\nZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEUkEERcgxneT5H+P+fERcbGmf\nbVx+M7rNWtgWUr6w+OBENebQA9ozTkeSg4c4M+qdYSObFqjxITdYxT1z/nHz1gyx\nOKAhLjWu+nkbRefqy3RwXaWT680uUaAP6ccnkZOMo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MB0GA1UdDgQWBBSN6fxlg0s5Wny08uRBYZcQ3TUoyzAOBgNVHQ8BAf8EBAMC\nAYYwCgYIKoZIzj0EAwMDaQAwZgIxAORaz+MBVoFBTmZ93j2G2vYTwA6T5hWzBWrx\nCrI54pKn5g6At56DBrkjrwZF5T1enAIxAJe/LZ9xpDkAdxDgGJFN8gZYLRWc0NRy\nRb4hihy5vj9L+w9uKc9VfEBIFuhT7Z3ljg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIQB/57HSuaqUkLaasdjxUdPjANBgkqhkiG9w0BAQsFADCB\nmDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChB\nbWF6b24gUkRTIGFwLXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUxOTE3NDAzNFoYDzIwNjEwNTE5MTg0MDM0WjCBmDEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChBbWF6\nb24gUkRTIGFwLXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQHDAdT\nZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtbkaoVsUS76o\nTgLFmcnaB8cswBk1M3Bf4IVRcwWT3a1HeJSnaJUqWHCJ+u3ip/zGVOYl0gN1MgBb\nMuQRIJiB95zGVcIa6HZtx00VezDTr3jgGWRHmRjNVCCHGmxOZWvJjsIE1xavT/1j\nQYV/ph4EZEIZ/qPq7e3rHohJaHDe23Z7QM9kbyqp2hANG2JtU/iUhCxqgqUHNozV\nZd0l5K6KnltZQoBhhekKgyiHqdTrH8fWajYl5seD71bs0Axowb+Oh0rwmrws3Db2\nDh+oc2PwREnjHeca9/1C6J2vhY+V0LGaJmnnIuOANrslx2+bgMlyhf9j0Bv8AwSi\ndSWsobOhNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQb7vJT\nVciLN72yJGhaRKLn6Krn2TAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD\nggEBAAxEj8N9GslReAQnNOBpGl8SLgCMTejQ6AW/bapQvzxrZrfVOZOYwp/5oV0f\n9S1jcGysDM+DrmfUJNzWxq2Y586R94WtpH4UpJDGqZp+FuOVJL313te4609kopzO\nlDdmd+8z61+0Au93wB1rMiEfnIMkOEyt7D2eTFJfJRKNmnPrd8RjimRDlFgcLWJA\n3E8wca67Lz/G0eAeLhRHIXv429y8RRXDtKNNz0wA2RwURWIxyPjn1fHjA9SPDkeW\nE1Bq7gZj+tBnrqz+ra3yjZ2blss6Ds3/uRY6NYqseFTZWmQWT7FolZEnT9vMUitW\nI0VynUbShVpGf6946e0vgaaKw20=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/jCCAuagAwIBAgIQGyUVTaVjYJvWhroVEiHPpDANBgkqhkiG9w0BAQsFADCB\nlzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\nbWF6b24gUkRTIHVzLXdlc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTE5MTkwNDA2WhgPMjA2MTA1MTkyMDA0MDZaMIGXMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\nbiBSRFMgdXMtd2VzdC0xIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANhyXpJ0t4nigRDZ\nEwNtFOem1rM1k8k5XmziHKDvDk831p7QsX9ZOxl/BT59Pu/P+6W6SvasIyKls1sW\nFJIjFF+6xRQcpoE5L5evMgN/JXahpKGeQJPOX9UEXVW5B8yi+/dyUitFT7YK5LZA\nMqWBN/LtHVPa8UmE88RCDLiKkqiv229tmwZtWT7nlMTTCqiAHMFcryZHx0pf9VPh\nx/iPV8p2gBJnuPwcz7z1kRKNmJ8/cWaY+9w4q7AYlAMaq/rzEqDaN2XXevdpsYAK\nTMMj2kji4x1oZO50+VPNfBl5ZgJc92qz1ocF95SAwMfOUsP8AIRZkf0CILJYlgzk\n/6u6qZECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm5jfcS9o\n+LwL517HpB6hG+PmpBswDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IB\nAQAcQ6lsqxi63MtpGk9XK8mCxGRLCad51+MF6gcNz6i6PAqhPOoKCoFqdj4cEQTF\nF8dCfa3pvfJhxV6RIh+t5FCk/y6bWT8Ls/fYKVo6FhHj57bcemWsw/Z0XnROdVfK\nYqbc7zvjCPmwPHEqYBhjU34NcY4UF9yPmlLOL8uO1JKXa3CAR0htIoW4Pbmo6sA4\n6P0co/clW+3zzsQ92yUCjYmRNeSbdXbPfz3K/RtFfZ8jMtriRGuO7KNxp8MqrUho\nHK8O0mlSUxGXBZMNicfo7qY8FD21GIPH9w5fp5oiAl7lqFzt3E3sCLD3IiVJmxbf\nfUwpGd1XZBBSdIxysRLM6j48\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrTCCAjOgAwIBAgIQU+PAILXGkpoTcpF200VD/jAKBggqhkjOPQQDAzCBljEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMS8wLQYDVQQDDCZBbWF6\nb24gUkRTIGFwLWVhc3QtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTAgFw0yMTA1MjUyMTQ1MTFaGA8yMTIxMDUyNTIyNDUxMVowgZYxCzAJBgNV\nBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYD\nVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1hem9uIFJE\nUyBhcC1lYXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1NlYXR0bGUw\ndjAQBgcqhkjOPQIBBgUrgQQAIgNiAAT3tFKE8Kw1sGQAvNLlLhd8OcGhlc7MiW/s\nNXm3pOiCT4vZpawKvHBzD76Kcv+ZZzHRxQEmG1/muDzZGlKR32h8AAj+NNO2Wy3d\nCKTtYMiVF6Z2zjtuSkZQdjuQbe4eQ7qjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\nVR0OBBYEFAiSQOp16Vv0Ohpvqcbd2j5RmhYNMA4GA1UdDwEB/wQEAwIBhjAKBggq\nhkjOPQQDAwNoADBlAjBVsi+5Ape0kOhMt/WFkANkslD4qXA5uqhrfAtH29Xzz2NV\ntR7akiA771OaIGB/6xsCMQCZt2egCtbX7J0WkuZ2KivTh66jecJr5DHvAP4X2xtS\nF/5pS+AUhcKTEGjI9jDH3ew=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICuDCCAj2gAwIBAgIQT5mGlavQzFHsB7hV6Mmy6TAKBggqhkjOPQQDAzCBmzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\nb24gUkRTIGFwLXNvdXRoZWFzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyNDIwNTAxNVoYDzIxMjEwNTI0MjE1MDE1WjCBmzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\nb24gUkRTIGFwLXNvdXRoZWFzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEcm4BBBjYK7clwm0HJRWS\nflt3iYwoJbIXiXn9c1y3E+Vb7bmuyKhS4eO8mwO4GefUcXObRfoHY2TZLhMJLVBQ\n7MN2xDc0RtZNj07BbGD3VAIFRTDX0mH9UNYd0JQM3t/Oo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MB0GA1UdDgQWBBRrd5ITedfAwrGo4FA9UaDaGFK3rjAOBgNVHQ8BAf8E\nBAMCAYYwCgYIKoZIzj0EAwMDaQAwZgIxAPBNqmVv1IIA3EZyQ6XuVf4gj79/DMO8\nbkicNS1EcBpUqbSuU4Zwt2BYc8c/t7KVOQIxAOHoWkoKZPiKyCxfMtJpCZySUG+n\nsXgB/LOyWE5BJcXUfm+T1ckeNoWeUUMOLmnJjg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgIRAJcDeinvdNrDQBeJ8+t38WQwDQYJKoZIhvcNAQELBQAw\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtNCBSb290IENBIFJTQTIwNDggRzExEDAO\nBgNVBAcMB1NlYXR0bGUwIBcNMjIwNTI1MTY0OTE2WhgPMjA2MjA1MjUxNzQ5MTZa\nMIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\nSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\nLEFtYXpvbiBSRFMgYXAtc291dGhlYXN0LTQgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\nDgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nk8DBNkr9tMoIM0NHoFiO7cQfSX0cOMhEuk/CHt0fFx95IBytx7GHCnNzpM27O5z6\nx6iRhfNnx+B6CrGyCzOjxvPizneY+h+9zfvNz9jj7L1I2uYMuiNyOKR6FkHR46CT\n1CiArfVLLPaTqgD/rQjS0GL2sLHS/0dmYipzynnZcs613XT0rAWdYDYgxDq7r/Yi\nXge5AkWQFkMUq3nOYDLCyGGfQqWKkwv6lZUHLCDKf+Y0Uvsrj8YGCI1O8mF0qPCQ\nlmlfaDvbuBu1AV+aabmkvyFj3b8KRIlNLEtQ4N8KGYR2Jdb82S4YUGIOAt4wuuFt\n1B7AUDLk3V/u+HTWiwfoLQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\nDgQWBBSNpcjz6ArWBtAA+Gz6kyyZxrrgdDAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\nhvcNAQELBQADggEBAGJEd7UgOzHYIcQRSF7nSYyjLROyalaIV9AX4WXW/Cqlul1c\nMblP5etDZm7A/thliZIWAuyqv2bNicmS3xKvNy6/QYi1YgxZyy/qwJ3NdFl067W0\nt8nGo29B+EVK94IPjzFHWShuoktIgp+dmpijB7wkTIk8SmIoe9yuY4+hzgqk+bo4\nms2SOXSN1DoQ75Xv+YmztbnZM8MuWhL1T7hA4AMorzTQLJ9Pof8SpSdMHeDsHp0R\n01jogNFkwy25nw7cL62nufSuH2fPYGWXyNDg+y42wKsKWYXLRgUQuDVEJ2OmTFMB\nT0Vf7VuNijfIA9hkN2d3K53m/9z5WjGPSdOjGhg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/jCCAuagAwIBAgIQRiwspKyrO0xoxDgSkqLZczANBgkqhkiG9w0BAQsFADCB\nlzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\nbWF6b24gUkRTIHVzLXdlc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTI0MjE1OTAwWhgPMjA2MTA1MjQyMjU5MDBaMIGXMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\nbiBSRFMgdXMtd2VzdC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL53Jk3GsKiu+4bx\njDfsevWbwPCNJ3H08Zp7GWhvI3Tgi39opfHYv2ku2BKFjK8N2L6RvNPSR8yplv5j\nY0tK0U+XVNl8o0ibhqRDhbTuh6KL8CFINWYzAajuxFS+CF0U6c1Q3tXLBdALxA7l\nFlXJ71QrP06W31kRe7kvgrvO7qWU3/OzUf9qYw4LSiR1/VkvvRCTqcVNw09clw/M\nJbw6FSgweN65M9j7zPbjGAXSHkXyxH1Erin2fa+B9PE4ZDgX9cp2C1DHewYJQL/g\nSepwwcudVNRN1ibKH7kpMrgPnaNIVNx5sXVsTjk6q2ZqYw3SVHegltJpLy/cZReP\nmlivF2kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUmTcQd6o1\nCuS65MjBrMwQ9JJjmBwwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IB\nAQAKSDSIzl956wVddPThf2VAzI8syw9ngSwsEHZvxVGHBvu5gg618rDyguVCYX9L\n4Kw/xJrk6S3qxOS2ZDyBcOpsrBskgahDFIunzoRP3a18ARQVq55LVgfwSDQiunch\nBd05cnFGLoiLkR5rrkgYaP2ftn3gRBRaf0y0S3JXZ2XB3sMZxGxavYq9mfiEcwB0\nLMTMQ1NYzahIeG6Jm3LqRqR8HkzP/Ztq4dT2AtSLvFebbNMiWqeqT7OcYp94HTYT\nzqrtaVdUg9bwyAUCDgy0GV9RHDIdNAOInU/4LEETovrtuBU7Z1q4tcHXvN6Hd1H8\ngMb0mCG5I393qW5hFsA/diFb\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgIRAPQAvihfjBg/JDbj6U64K98wDQYJKoZIhvcNAQELBQAw\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBhcC1ub3J0aGVhc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAO\nBgNVBAcMB1NlYXR0bGUwIBcNMjEwNTIwMTYyODQxWhgPMjA2MTA1MjAxNzI4NDFa\nMIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\nSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\nLEFtYXpvbiBSRFMgYXAtbm9ydGhlYXN0LTIgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\nDgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nvJ9lgyksCxkBlY40qOzI1TCj/Q0FVGuPL/Z1Mw2YN0l+41BDv0FHApjTUkIKOeIP\nnwDwpXTa3NjYbk3cOZ/fpH2rYJ++Fte6PNDGPgKppVCUh6x3jiVZ1L7wOgnTdK1Q\nTrw8440IDS5eLykRHvz8OmwvYDl0iIrt832V0QyOlHTGt6ZJ/aTQKl12Fy3QBLv7\nstClPzvHTrgWqVU6uidSYoDtzHbU7Vda7YH0wD9IUoMBf7Tu0rqcE4uH47s2XYkc\nSdLEoOg/Ngs7Y9B1y1GCyj3Ux7hnyvCoRTw014QyNB7dTatFMDvYlrRDGG14KeiU\nUL7Vo/+EejWI31eXNLw84wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\nDgQWBBQkgTWFsNg6wA3HbbihDQ4vpt1E2zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\nhvcNAQELBQADggEBAGz1Asiw7hn5WYUj8RpOCzpE0h/oBZcnxP8wulzZ5Xd0YxWO\n0jYUcUk3tTQy1QvoY+Q5aCjg6vFv+oFBAxkib/SmZzp4xLisZIGlzpJQuAgRkwWA\n6BVMgRS+AaOMQ6wKPgz1x4v6T0cIELZEPq3piGxvvqkcLZKdCaeC3wCS6sxuafzZ\n4qA3zMwWuLOzRftgX2hQto7d/2YkRXga7jSvQl3id/EI+xrYoH6zIWgjdU1AUaNq\nNGT7DIo47vVMfnd9HFZNhREsd4GJE83I+JhTqIxiKPNxrKgESzyADmNPt0gXDnHo\ntbV1pMZz5HpJtjnP/qVZhEK5oB0tqlKPv9yx074=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICuTCCAj6gAwIBAgIRAKp1Rn3aL/g/6oiHVIXtCq8wCgYIKoZIzj0EAwMwgZsx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE0MDIGA1UEAwwrQW1h\nem9uIFJEUyBhcC1ub3J0aGVhc3QtMyBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UE\nBwwHU2VhdHRsZTAgFw0yMTA1MjQyMDMyMTdaGA8yMTIxMDUyNDIxMzIxN1owgZsx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE0MDIGA1UEAwwrQW1h\nem9uIFJEUyBhcC1ub3J0aGVhc3QtMyBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UE\nBwwHU2VhdHRsZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGTYWPILeBJXfcL3Dz4z\nEWMUq78xB1HpjBwHoTURYfcMd5r96BTVG6yaUBWnAVCMeeD6yTG9a1eVGNhG14Hk\nZAEjgLiNB7RRbEG5JZ/XV7W/vODh09WCst2y9SLKsdgeAaNCMEAwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQUoE0qZHmDCDB+Bnm8GUa/evpfPwgwDgYDVR0PAQH/\nBAQDAgGGMAoGCCqGSM49BAMDA2kAMGYCMQCnil5MMwhY3qoXv0xvcKZGxGPaBV15\n0CCssCKn0oVtdJQfJQ3Jrf3RSaEyijXIJsoCMQC35iJi4cWoNX3N/qfgnHohW52O\nB5dg0DYMqy5cNZ40+UcAanRMyqNQ6P7fy3umGco=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICtzCCAj2gAwIBAgIQPXnDTPegvJrI98qz8WxrMjAKBggqhkjOPQQDAzCBmzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\nb24gUkRTIEJldGEgdXMtZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUxODIxNDAxMloYDzIxMjEwNTE4MjI0MDEyWjCBmzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\nb24gUkRTIEJldGEgdXMtZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEI0sR7gwutK5AB46hM761\ngcLTGBIYlURSEoM1jcBwy56CL+3CJKZwLLyJ7qoOKfWbu5GsVLUTWS8MV6Nw33cx\n2KQD2svb694wi+Px2f4n9+XHkEFQw8BbiodDD7RZA70fo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MB0GA1UdDgQWBBTQSioOvnVLEMXwNSDg+zgln/vAkjAOBgNVHQ8BAf8E\nBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIxAMwu1hqm5Bc98uE/E0B5iMYbBQ4kpMxO\ntP8FTfz5UR37HUn26nXE0puj6S/Ffj4oJgIwXI7s2c26tFQeqzq6u3lrNJHp5jC9\nUxlo/hEJOLoDj5jnpxo8dMAtCNoQPaHdfL0P\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjWgAwIBAgIQGKVv+5VuzEZEBzJ+bVfx2zAKBggqhkjOPQQDAzCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIGFwLXNvdXRoLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTE5MTc1MDU5WhgPMjEyMTA1MTkxODUwNTlaMIGXMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpvbiBS\nRFMgYXAtc291dGgtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2VhdHRs\nZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMqdLJ0tZF/DGFZTKZDrGRJZID8ivC2I\nJRCYTWweZKCKSCAzoiuGGHzJhr5RlLHQf/QgmFcgXsdmO2n3CggzhA4tOD9Ip7Lk\nP05eHd2UPInyPCHRgmGjGb0Z+RdQ6zkitKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAd\nBgNVHQ4EFgQUC1yhRgVqU5bR8cGzOUCIxRpl4EYwDgYDVR0PAQH/BAQDAgGGMAoG\nCCqGSM49BAMDA2cAMGQCMG0c/zLGECRPzGKJvYCkpFTCUvdP4J74YP0v/dPvKojL\nt/BrR1Tg4xlfhaib7hPc7wIwFvgqHes20CubQnZmswbTKLUrgSUW4/lcKFpouFd2\nt2/ewfi/0VhkeUW+IiHhOMdU\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGCTCCA/GgAwIBAgIRAOXxJuyXVkbfhZCkS/dOpfEwDQYJKoZIhvcNAQEMBQAw\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBhcC1ub3J0aGVhc3QtMSBSb290IENBIFJTQTQwOTYgRzExEDAO\nBgNVBAcMB1NlYXR0bGUwIBcNMjEwNTI1MjE1OTEwWhgPMjEyMTA1MjUyMjU5MTBa\nMIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\nSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\nLEFtYXpvbiBSRFMgYXAtbm9ydGhlYXN0LTEgUm9vdCBDQSBSU0E0MDk2IEcxMRAw\nDgYDVQQHDAdTZWF0dGxlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA\nxiP4RDYm4tIS12hGgn1csfO8onQDmK5SZDswUpl0HIKXOUVVWkHNlINkVxbdqpqH\nFhbyZmNN6F/EWopotMDKe1B+NLrjNQf4zefv2vyKvPHJXhxoKmfyuTd5Wk8k1F7I\nlNwLQzznB+ElhrLIDJl9Ro8t31YBBNFRGAGEnxyACFGcdkjlsa52UwfYrwreEg2l\ngW5AzqHgjFfj9QRLydeU/n4bHm0F1adMsV7P3rVwilcUlqsENDwXnWyPEyv3sw6F\nwNemLEs1129mB77fwvySb+lLNGsnzr8w4wdioZ74co+T9z2ca+eUiP+EQccVw1Is\nD4Fh57IjPa6Wuc4mwiUYKkKY63+38aCfEWb0Qoi+zW+mE9nek6MOQ914cN12u5LX\ndBoYopphRO5YmubSN4xcBy405nIdSdbrAVWwxXnVVyjqjknmNeqQsPZaxAhdoKhV\nAqxNr8AUAdOAO6Sz3MslmcLlDXFihrEEOeUbpg/m1mSUUHGbu966ajTG1FuEHHwS\n7WB52yxoJo/tHvt9nAWnh3uH5BHmS8zn6s6CGweWKbX5yICnZ1QFR1e4pogxX39v\nXD6YcNOO+Vn+HY4nXmjgSYVC7l+eeP8eduMg1xJujzjrbmrXU+d+cBObgdTOAlpa\nJFHaGwYw1osAwPCo9cZ2f04yitBfj9aPFia8ASKldakCAwEAAaNCMEAwDwYDVR0T\nAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqKS+ltlior0SyZKYAkJ/efv55towDgYDVR0P\nAQH/BAQDAgGGMA0GCSqGSIb3DQEBDAUAA4ICAQAdElvp8bW4B+Cv+1WSN87dg6TN\nwGyIjJ14/QYURgyrZiYpUmZpj+/pJmprSWXu4KNyqHftmaidu7cdjL5nCAvAfnY5\n/6eDDbX4j8Gt9fb/6H9y0O0dn3mUPSEKG0crR+JRFAtPhn/2FNvst2P82yguWLv0\npHjHVUVcq+HqDMtUIJsTPYjSh9Iy77Q6TOZKln9dyDOWJpCSkiUWQtMAKbCSlvzd\nzTs/ahqpT+zLfGR1SR+T3snZHgQnbnemmz/XtlKl52NxccARwfcEEKaCRQyGq/pR\n0PVZasyJS9JY4JfQs4YOdeOt4UMZ8BmW1+BQWGSkkb0QIRl8CszoKofucAlqdPcO\nIT/ZaMVhI580LFGWiQIizWFskX6lqbCyHqJB3LDl8gJISB5vNTHOHpvpMOMs5PYt\ncRl5Mrksx5MKMqG7y5R734nMlZxQIHjL5FOoOxTBp9KeWIL/Ib89T2QDaLw1SQ+w\nihqWBJ4ZdrIMWYpP3WqM+MXWk7WAem+xsFJdR+MDgOOuobVQTy5dGBlPks/6gpjm\nrO9TjfQ36ppJ3b7LdKUPeRfnYmlR5RU4oyYJ//uLbClI443RZAgxaCXX/nyc12lr\neVLUMNF2abLX4/VF63m2/Z9ACgMRfqGshPssn1NN33OonrotQoj4S3N9ZrjvzKt8\niHcaqd60QKpfiH2A3A==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICuDCCAj2gAwIBAgIQPaVGRuu86nh/ylZVCLB0MzAKBggqhkjOPQQDAzCBmzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\nb24gUkRTIGFwLW5vcnRoZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyNTIyMDMxNloYDzIxMjEwNTI1MjMwMzE2WjCBmzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\nb24gUkRTIGFwLW5vcnRoZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEexNURoB9KE93MEtEAlJG\nobz4LS/pD2hc8Gczix1WhVvpJ8bN5zCDXaKdnDMCebetyRQsmQ2LYlfmCwpZwSDu\n0zowB11Pt3I5Avu2EEcuKTlKIDMBeZ1WWuOd3Tf7MEAMo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MB0GA1UdDgQWBBSaYbZPBvFLikSAjpa8mRJvyArMxzAOBgNVHQ8BAf8E\nBAMCAYYwCgYIKoZIzj0EAwMDaQAwZgIxAOEJkuh3Zjb7Ih/zuNRd1RBqmIYcnyw0\nnwUZczKXry+9XebYj3VQxSRNadrarPWVqgIxAMg1dyGoDAYjY/L/9YElyMnvHltO\nPwpJShmqHvCLc/mXMgjjYb/akK7yGthvW6j/uQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGCDCCA/CgAwIBAgIQChu3v5W1Doil3v6pgRIcVzANBgkqhkiG9w0BAQwFADCB\nnDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTUwMwYDVQQDDCxB\nbWF6b24gUkRTIEJldGEgdXMtZWFzdC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4G\nA1UEBwwHU2VhdHRsZTAgFw0yMTA1MTgyMTM0MTVaGA8yMTIxMDUxODIyMzQxNVow\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBCZXRhIHVzLWVhc3QtMSBSb290IENBIFJTQTQwOTYgRzExEDAO\nBgNVBAcMB1NlYXR0bGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC1\nFUGQ5tf3OwpDR6hGBxhUcrkwKZhaXP+1St1lSOQvjG8wXT3RkKzRGMvb7Ee0kzqI\nmzKKe4ASIhtV3UUWdlNmP0EA3XKnif6N79MismTeGkDj75Yzp5A6tSvqByCgxIjK\nJqpJrch3Dszoyn8+XhwDxMZtkUa5nQVdJgPzJ6ltsQ8E4SWLyLtTu0S63jJDkqYY\nS7cQblk7y7fel+Vn+LS5dGTdRRhMvSzEnb6mkVBaVzRyVX90FNUED06e8q+gU8Ob\nhtvQlf9/kRzHwRAdls2YBhH40ZeyhpUC7vdtPwlmIyvW5CZ/QiG0yglixnL6xahL\npbmTuTSA/Oqz4UGQZv2WzHe1lD2gRHhtFX2poQZeNQX8wO9IcUhrH5XurW/G9Xwl\nSat9CMPERQn4KC3HSkat4ir2xaEUrjfg6c4XsGyh2Pk/LZ0gLKum0dyWYpWP4JmM\nRQNjrInXPbMhzQObozCyFT7jYegS/3cppdyy+K1K7434wzQGLU1gYXDKFnXwkX8R\nbRKgx2pHNbH5lUddjnNt75+e8m83ygSq/ZNBUz2Ur6W2s0pl6aBjwaDES4VfWYlI\njokcmrGvJNDfQWygb1k00eF2bzNeNCHwgWsuo3HSxVgc/WGsbcGrTlDKfz+g3ich\nbXUeUidPhRiv5UQIVCLIHpHuin3bj9lQO/0t6p+tAQIDAQABo0IwQDAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBSFmMBgm5IsRv3hLrvDPIhcPweXYTAOBgNVHQ8B\nAf8EBAMCAYYwDQYJKoZIhvcNAQEMBQADggIBAAa2EuozymOsQDJlEi7TqnyA2OhT\nGXPfYqCyMJVkfrqNgcnsNpCAiNEiZbb+8sIPXnT8Ay8hrwJYEObJ5b7MHXpLuyft\nz0Pu1oFLKnQxKjNxrIsCvaB4CRRdYjm1q7EqGhMGv76se9stOxkOqO9it31w/LoU\nENDk7GLsSqsV1OzYLhaH8t+MaNP6rZTSNuPrHwbV3CtBFl2TAZ7iKgKOhdFz1Hh9\nPez0lG+oKi4mHZ7ajov6PD0W7njn5KqzCAkJR6OYmlNVPjir+c/vUtEs0j+owsMl\ng7KE5g4ZpTRShyh5BjCFRK2tv0tkqafzNtxrKC5XNpEkqqVTCnLcKG+OplIEadtr\nC7UWf4HyhCiR+xIyxFyR05p3uY/QQU/5uza7GlK0J+U1sBUytx7BZ+Fo8KQfPPqV\nCqDCaYUksoJcnJE/KeoksyqNQys7sDGJhkd0NeUGDrFLKHSLhIwAMbEWnqGxvhli\nE7sP2E5rI/I9Y9zTbLIiI8pfeZlFF8DBdoP/Hzg8pqsiE/yiXSFTKByDwKzGwNqz\nF0VoFdIZcIbLdDbzlQitgGpJtvEL7HseB0WH7B2PMMD8KPJlYvPveO3/6OLzCsav\n+CAkvk47NQViKMsUTKOA0JDCW+u981YRozxa3K081snhSiSe83zIPBz1ikldXxO9\n6YYLNPRrj3mi9T/f\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjSgAwIBAgIRAMkvdFnVDb0mWWFiXqnKH68wCgYIKoZIzj0EAwMwgZYx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\nem9uIFJEUyB1cy13ZXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTE5MTkxMzI0WhgPMjEyMTA1MTkyMDEzMjRaMIGWMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\nRFMgdXMtd2VzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEy86DB+9th/0A5VcWqMSWDxIUblWTt/R0\nao6Z2l3vf2YDF2wt1A2NIOGpfQ5+WAOJO/IQmnV9LhYo+kacB8sOnXdQa6biZZkR\nIyouUfikVQAKWEJnh1Cuo5YMM4E2sUt5o0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\nA1UdDgQWBBQ8u3OnecANmG8OoT7KLWDuFzZwBTAOBgNVHQ8BAf8EBAMCAYYwCgYI\nKoZIzj0EAwMDaAAwZQIwQ817qkb7mWJFnieRAN+m9W3E0FLVKaV3zC5aYJUk2fcZ\nTaUx3oLp3jPLGvY5+wgeAjEA6wAicAki4ZiDfxvAIuYiIe1OS/7H5RA++R8BH6qG\niRzUBM/FItFpnkus7u/eTkvo\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrzCCAjWgAwIBAgIQS/+Ryfgb/IOVEa1pWoe8oTAKBggqhkjOPQQDAzCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIGFwLXNvdXRoLTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjIwNjA2MjE1NDQyWhgPMjEyMjA2MDYyMjU0NDJaMIGXMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpvbiBS\nRFMgYXAtc291dGgtMiBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2VhdHRs\nZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDsX6fhdUWBQpYTdseBD/P3s96Dtw2Iw\nOrXKNToCnmX5nMkUGdRn9qKNiz1pw3EPzaPxShbYwQ7LYP09ENK/JN4QQjxMihxC\njLFxS85nhBQQQGRCWikDAe38mD8fSvREQKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAd\nBgNVHQ4EFgQUIh1xZiseQYFjPYKJmGbruAgRH+AwDgYDVR0PAQH/BAQDAgGGMAoG\nCCqGSM49BAMDA2gAMGUCMFudS4zLy+UUGrtgNLtRMcu/DZ9BUzV4NdHxo0bkG44O\nthnjl4+wTKI6VbyAbj2rkgIxAOHps8NMITU5DpyiMnKTxV8ubb/WGHrLl0BjB8Lw\nETVJk5DNuZvsIIcm7ykk6iL4Tw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGBDCCA+ygAwIBAgIQDcEmNIAVrDpUw5cH5ynutDANBgkqhkiG9w0BAQwFADCB\nmjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\nbWF6b24gUkRTIG1lLWNlbnRyYWwtMSBSb290IENBIFJTQTQwOTYgRzExEDAOBgNV\nBAcMB1NlYXR0bGUwIBcNMjIwNTA3MDA0MDIzWhgPMjEyMjA1MDcwMTQwMjNaMIGa\nMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5j\nLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMzAxBgNVBAMMKkFt\nYXpvbiBSRFMgbWUtY2VudHJhbC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UE\nBwwHU2VhdHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKvADk8t\nFl9bFlU5sajLPPDSOUpPAkKs6iPlz+27o1GJC88THcOvf3x0nVAcu9WYe9Qaas+4\nj4a0vv51agqyODRD/SNi2HnqW7DbtLPAm6KBHe4twl28ItB/JD5g7u1oPAHFoXMS\ncH1CZEAs5RtlZGzJhcBXLFsHNv/7+SCLyZ7+2XFh9OrtgU4wMzkHoRNndhfwV5bu\n17bPTwuH+VxH37zXf1mQ/KjhuJos0C9dL0FpjYBAuyZTAWhZKs8dpSe4DI544z4w\ngkwUB4bC2nA1TBzsywEAHyNuZ/xRjNpWvx0ToWAA2iFJqC3VO3iKcnBplMvaUuMt\njwzVSNBnKcoabXCZL2XDLt4YTZR8FSwz05IvsmwcPB7uNTBXq3T9sjejW8QQK3vT\ntzyfLq4jKmQE7PoS6cqYm+hEPm2hDaC/WP9bp3FdEJxZlPH26fq1b7BWYWhQ9pBA\nNv9zTnzdR1xohTyOJBUFQ81ybEzabqXqVXUIANqIOaNcTB09/sLJ7+zuMhp3mwBu\nLtjfJv8PLuT1r63bU3seROhKA98b5KfzjvbvPSg3vws78JQyoYGbqNyDfyjVjg3U\nv//AdVuPie6PNtdrW3upZY4Qti5IjP9e3kimaJ+KAtTgMRG56W0WxD3SP7+YGGbG\nKhntDOkKsN39hLpn9UOafTIqFu7kIaueEy/NAgMBAAGjQjBAMA8GA1UdEwEB/wQF\nMAMBAf8wHQYDVR0OBBYEFHAems86dTwdZbLe8AaPy3kfIUVoMA4GA1UdDwEB/wQE\nAwIBhjANBgkqhkiG9w0BAQwFAAOCAgEAOBHpp0ICx81kmeoBcZTrMdJs2gnhcd85\nFoSCjXx9H5XE5rmN/lQcxxOgj8hr3uPuLdLHu+i6THAyzjrl2NA1FWiqpfeECGmy\n0jm7iZsYORgGQYp/VKnDrwnKNSqlZvOuRr0kfUexwFlr34Y4VmupvEOK/RdGsd3S\n+3hiemcHse9ST/sJLHx962AWMkN86UHPscJEe4+eT3f2Wyzg6La8ARwdWZSNS+WH\nZfybrncMmuiXuUdHv9XspPsqhKgtHhcYeXOGUtrwQPLe3+VJZ0LVxhlTWr9951GZ\nGfmWwTV/9VsyKVaCFIXeQ6L+gjcKyEzYF8wpMtQlSc7FFqwgC4bKxvMBSaRy88Nr\nlV2+tJD/fr8zGUeBK44Emon0HKDBWGX+/Hq1ZIv0Da0S+j6LbA4fusWxtGfuGha+\nluhHgVInCpALIOamiBEdGhILkoTtx7JrYppt3/Raqg9gUNCOOYlCvGhqX7DXeEfL\nDGabooiY2FNWot6h04JE9nqGj5QqT8D6t/TL1nzxhRPzbcSDIHUd/b5R+a0bAA+7\nYTU6JqzEVCWKEIEynYmqikgLMGB/OzWsgyEL6822QW6hJAQ78XpbNeCzrICF4+GC\n7KShLnwuWoWpAb26268lvOEvCTFM47VC6jNQl97md+2SA9Ma81C9wflid2M83Wle\ncuLMVcQZceE=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIQAhAteLRCvizAElaWORFU2zANBgkqhkiG9w0BAQsFADCB\nmDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChB\nbWF6b24gUkRTIG1lLXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyMDE3MDkxNloYDzIwNjEwNTIwMTgwOTE2WjCBmDEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChBbWF6\nb24gUkRTIG1lLXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQHDAdT\nZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+qg7JAcOVKjh\nN83SACnBFZPyB63EusfDr/0V9ZdL8lKcmZX9sv/CqoBo3N0EvBqHQqUUX6JvFb7F\nXrMUZ740kr28gSRALfXTFgNODjXeDsCtEkKRTkac/UM8xXHn+hR7UFRPHS3e0GzI\niLiwQWDkr0Op74W8aM0CfaVKvh2bp4BI1jJbdDnQ9OKXpOxNHGUf0ZGb7TkNPkgI\nb2CBAc8J5o3H9lfw4uiyvl6Fz5JoP+A+zPELAioYBXDrbE7wJeqQDJrETWqR9VEK\nBXURCkVnHeaJy123MpAX2ozf4pqk0V0LOEOZRS29I+USF5DcWr7QIXR/w2I8ws1Q\n7ys+qbE+kQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQFJ16n\n1EcCMOIhoZs/F9sR+Jy++zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD\nggEBAOc5nXbT3XTDEZsxX2iD15YrQvmL5m13B3ImZWpx/pqmObsgx3/dg75rF2nQ\nqS+Vl+f/HLh516pj2BPP/yWCq12TRYigGav8UH0qdT3CAClYy2o+zAzUJHm84oiB\nud+6pFVGkbqpsY+QMpJUbZWu52KViBpJMYsUEy+9cnPSFRVuRAHjYynSiLk2ZEjb\nWkdc4x0nOZR5tP0FgrX0Ve2KcjFwVQJVZLgOUqmFYQ/G0TIIGTNh9tcmR7yp+xJR\nA2tbPV2Z6m9Yxx4E8lLEPNuoeouJ/GR4CkMEmF8cLwM310t174o3lKKUXJ4Vs2HO\nWj2uN6R9oI+jGLMSswTzCNV1vgc=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICuDCCAj6gAwIBAgIRAOocLeZWjYkG/EbHmscuy8gwCgYIKoZIzj0EAwMwgZsx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE0MDIGA1UEAwwrQW1h\nem9uIFJEUyBhcC1zb3V0aGVhc3QtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UE\nBwwHU2VhdHRsZTAgFw0yMTA1MjEyMTUwMDFaGA8yMTIxMDUyMTIyNTAwMVowgZsx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE0MDIGA1UEAwwrQW1h\nem9uIFJEUyBhcC1zb3V0aGVhc3QtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UE\nBwwHU2VhdHRsZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABCEr3jq1KtRncnZfK5cq\nbtY0nW6ZG3FMbh7XwBIR6Ca0f8llGZ4vJEC1pXgiM/4Dh045B9ZIzNrR54rYOIfa\n2NcYZ7mk06DjIQML64hbAxbQzOAuNzLPx268MrlL2uW2XaNCMEAwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQUln75pChychwN4RfHl+tOinMrfVowDgYDVR0PAQH/\nBAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMGiyPINRU1mwZ4Crw01vpuPvxZxb2IOr\nyX3RNlOIu4We1H+5dQk5tIvH8KGYFbWEpAIxAO9NZ6/j9osMhLgZ0yj0WVjb+uZx\nYlZR9fyFisY/jNfX7QhSk+nrc3SFLRUNtpXrng==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBTCCAu2gAwIBAgIRAKiaRZatN8eiz9p0s0lu0rQwDQYJKoZIhvcNAQELBQAw\ngZoxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEzMDEGA1UEAwwq\nQW1hem9uIFJEUyBjYS1jZW50cmFsLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYD\nVQQHDAdTZWF0dGxlMCAXDTIxMDUyMTIyMDIzNVoYDzIwNjEwNTIxMjMwMjM1WjCB\nmjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\nbWF6b24gUkRTIGNhLWNlbnRyYWwtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNV\nBAcMB1NlYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCygVMf\nqB865IR9qYRBRFHn4eAqGJOCFx+UbraQZmjr/mnRqSkY+nhbM7Pn/DWOrRnxoh+w\nq5F9ZxdZ5D5T1v6kljVwxyfFgHItyyyIL0YS7e2h7cRRscCM+75kMedAP7icb4YN\nLfWBqfKHbHIOqvvQK8T6+Emu/QlG2B5LvuErrop9K0KinhITekpVIO4HCN61cuOe\nCADBKF/5uUJHwS9pWw3uUbpGUwsLBuhJzCY/OpJlDqC8Y9aToi2Ivl5u3/Q/sKjr\n6AZb9lx4q3J2z7tJDrm5MHYwV74elGSXoeoG8nODUqjgklIWAPrt6lQ3WJpO2kug\n8RhCdSbWkcXHfX95AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\nFOIxhqTPkKVqKBZvMWtKewKWDvDBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0B\nAQsFAAOCAQEAqoItII89lOl4TKvg0I1EinxafZLXIheLcdGCxpjRxlZ9QMQUN3yb\ny/8uFKBL0otbQgJEoGhxm4h0tp54g28M6TN1U0332dwkjYxUNwvzrMaV5Na55I2Z\n1hq4GB3NMXW+PvdtsgVOZbEN+zOyOZ5MvJHEQVkT3YRnf6avsdntltcRzHJ16pJc\nY8rR7yWwPXh1lPaPkxddrCtwayyGxNbNmRybjR48uHRhwu7v2WuAMdChL8H8bp89\nTQLMrMHgSbZfee9hKhO4Zebelf1/cslRSrhkG0ESq6G5MUINj6lMg2g6F0F7Xz2v\nncD/vuRN5P+vT8th/oZ0Q2Gc68Pun0cn/g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/zCCAuegAwIBAgIRAJYlnmkGRj4ju/2jBQsnXJYwDQYJKoZIhvcNAQELBQAw\ngZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\nQW1hem9uIFJEUyB1cy1lYXN0LTIgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyMTIzMDQ0NFoYDzIwNjEwNTIyMDAwNDQ0WjCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIHVzLWVhc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC74V3eigv+pCj5\nnqDBqplY0Jp16pTeNB06IKbzb4MOTvNde6QjsZxrE1xUmprT8LxQqN9tI3aDYEYk\nb9v4F99WtQVgCv3Y34tYKX9NwWQgwS1vQwnIR8zOFBYqsAsHEkeJuSqAB12AYUSd\nZv2RVFjiFmYJho2X30IrSLQfS/IE3KV7fCyMMm154+/K1Z2IJlcissydEAwgsUHw\nedrE6CxJVkkJ3EvIgG4ugK/suxd8eEMztaQYJwSdN8TdfT59LFuSPl7zmF3fIBdJ\n//WexcQmGabaJ7Xnx+6o2HTfkP8Zzzzaq8fvjAcvA7gyFH5EP26G2ZqMG+0y4pTx\nSPVTrQEXAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIWWuNEF\nsUMOC82XlfJeqazzrkPDMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\nAQEAgClmxcJaQTGpEZmjElL8G2Zc8lGc+ylGjiNlSIw8X25/bcLRptbDA90nuP+q\nzXAMhEf0ccbdpwxG/P5a8JipmHgqQLHfpkvaXx+0CuP++3k+chAJ3Gk5XtY587jX\n+MJfrPgjFt7vmMaKmynndf+NaIJAYczjhJj6xjPWmGrjM3MlTa9XesmelMwP3jep\nbApIWAvCYVjGndbK9byyMq1nyj0TUzB8oJZQooaR3MMjHTmADuVBylWzkRMxbKPl\n4Nlsk4Ef1JvIWBCzsMt+X17nuKfEatRfp3c9tbpGlAE/DSP0W2/Lnayxr4RpE9ds\nICF35uSis/7ZlsftODUe8wtpkQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nPqj2\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nKDPtFEk=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICtzCCAj2gAwIBAgIQVZ5Y/KqjR4XLou8MCD5pOjAKBggqhkjOPQQDAzCBmzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\nb24gUkRTIGFwLXNvdXRoZWFzdC00IFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIyMDUyNTE2NTgzM1oYDzIxMjIwNTI1MTc1ODMzWjCBmzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\nb24gUkRTIGFwLXNvdXRoZWFzdC00IFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEbo473OmpD5vkckdJajXg\nbrhmNFyoSa0WCY1njuZC2zMFp3zP6rX4I1r3imrYnJd9pFH/aSiV/r6L5ACE5RPx\n4qdg5SQ7JJUaZc3DWsTOiOed7BCZSzM+KTYK/2QzDMApo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MB0GA1UdDgQWBBTmogc06+1knsej1ltKUOdWFvwgsjAOBgNVHQ8BAf8E\nBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIxAIs7TlLMbGTWNXpGiKf9DxaM07d/iDHe\nF/Vv/wyWSTGdobxBL6iArQNVXz0Gr4dvPAIwd0rsoa6R0x5mtvhdRPtM37FYrbHJ\npbV+OMusQqcSLseunLBoCHenvJW0QOCQ8EDY\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGBTCCA+2gAwIBAgIRAO9dVdiLTEGO8kjUFExJmgowDQYJKoZIhvcNAQEMBQAw\ngZoxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEzMDEGA1UEAwwq\nQW1hem9uIFJEUyBpbC1jZW50cmFsLTEgUm9vdCBDQSBSU0E0MDk2IEcxMRAwDgYD\nVQQHDAdTZWF0dGxlMCAXDTIyMTIwMjIwMjYwOFoYDzIxMjIxMjAyMjEyNjA4WjCB\nmjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\nbWF6b24gUkRTIGlsLWNlbnRyYWwtMSBSb290IENBIFJTQTQwOTYgRzExEDAOBgNV\nBAcMB1NlYXR0bGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDkVHmJ\nbUc8CNDGBcgPmXHSHj5dS1PDnnpk3doCu6pahyYXW8tqAOmOqsDuNz48exY7YVy4\nu9I9OPBeTYB9ZUKwxq+1ZNLsr1cwVz5DdOyDREVFOjlU4rvw0eTgzhP5yw/d+Ai/\n+WmPebZG0irwPKN2f60W/KJ45UNtR+30MT8ugfnPuSHWjjV+dqCOCp/mj8nOCckn\nk8GoREwjuTFJMKInpQUC0BaVVX6LiIdgtoLY4wdx00EqNBuROoRTAvrked0jvm7J\nUI39CSYxhNZJ9F6LdESZXjI4u2apfNQeSoy6WptxFHr+kh2yss1B2KT6lbwGjwWm\nl9HODk9kbBNSy2NeewAms36q+p8wSLPavL28IRfK0UaBAiN1hr2a/2RDGCwOJmw6\n5erRC5IIX5kCStyXPEGhVPp18EvMuBd37eLIxjZBBO8AIDf4Ue8QmxSeZH0cT204\n3/Bd6XR6+Up9iMTxkHr1URcL1AR8Zd62lg/lbEfxePNMK9mQGxKP8eTMG5AjtW9G\nTatEoRclgE0wZQalXHmKpBNshyYdGqQZhzL1MxCxWzfHNgZkTKIsdzxrjnP7RiBR\njdRH0YhXn6Y906QfLwMCaufwfQ5J8+nj/tu7nG138kSxsu6VUkhnQJhUcUsxuHD/\nNnBx0KGVEldtZiZf7ccgtRVp1lA0OrVtq3ZLMQIDAQABo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MB0GA1UdDgQWBBQ2WC3p8rWeE2N0S4Om01KsNLpk/jAOBgNVHQ8BAf8E\nBAMCAYYwDQYJKoZIhvcNAQEMBQADggIBAFFEVDt45Obr6Ax9E4RMgsKjj4QjMFB9\nwHev1jL7hezl/ULrHuWxjIusaIZEIcKfn+v2aWtqOq13P3ht7jV5KsV29CmFuCdQ\nq3PWiAXVs+hnMskTOmGMDnptqd6/UuSIha8mlOKKAvnmRQJvfX9hIfb/b/mVyKWD\nuvTTmcy3cOTJY5ZIWGyzuvmcqA0YNcb7rkJt/iaLq4RX3/ofq4y4w36hefbcvj++\npXHOmXk3dAej3y6SMBOUcGMyCJcCluRPNYKDTLn+fitcPxPC3JG7fI5bxQ0D6Hpa\nqbyGBQu96sfahQyMc+//H8EYlo4b0vPeS5RFFXJS/VBf0AyNT4vVc7H17Q6KjeNp\nwEARqsIa7UalHx9MnxrQ/LSTTxiC8qmDkIFuQtw8iQMN0SoL5S0eCZNRD31awgaY\ny1PvY8JMN549ugIUjOXnown/OxharLW1evWUraU5rArq3JfeFpPXl4K/u10T5SCL\niJRoxFilGPMFE3hvnmbi5rEy8wRUn7TpLb4I4s/CB/lT2qZTPqvQHwxKCnMm9BKF\nNHb4rLL5dCvUi5NJ6fQ/exOoGdOVSfT7jqFeq2TtNunERSz9vpriweliB6iIe1Al\nThj8aEs1GqA764rLVGA+vUe18NhjJm9EemrdIzjSQFy/NdbN/DMaHqEzJogWloAI\nizQWYnCS19TJ\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICvTCCAkOgAwIBAgIQCIY7E/bFvFN2lK9Kckb0dTAKBggqhkjOPQQDAzCBnjEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTcwNQYDVQQDDC5BbWF6\nb24gUkRTIFByZXZpZXcgdXMtZWFzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYD\nVQQHDAdTZWF0dGxlMCAXDTIxMDUxODIxMDUxMFoYDzIxMjEwNTE4MjIwNTEwWjCB\nnjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTcwNQYDVQQDDC5B\nbWF6b24gUkRTIFByZXZpZXcgdXMtZWFzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAw\nDgYDVQQHDAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEMI0hzf1JCEOI\nEue4+DmcNnSs2i2UaJxHMrNGGfU7b42a7vwP53F7045ffHPBGP4jb9q02/bStZzd\nVHqfcgqkSRI7beBKjD2mfz82hF/wJSITTgCLs+NRpS6zKMFOFHUNo0IwQDAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS8uF/6hk5mPLH4qaWv9NVZaMmyTjAOBgNV\nHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIxAO7Pu9wzLyM0X7Q08uLIL+vL\nqaxe3UFuzFTWjM16MLJHbzLf1i9IDFKz+Q4hXCSiJwIwClMBsqT49BPUxVsJnjGr\nEbyEk6aOOVfY1p2yQL649zh3M4h8okLnwf+bYIb1YpeU\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIQY+JhwFEQTe36qyRlUlF8ozANBgkqhkiG9w0BAQsFADCB\nmDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChB\nbWF6b24gUkRTIGFmLXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUxOTE5MjQxNloYDzIwNjEwNTE5MjAyNDE2WjCBmDEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChBbWF6\nb24gUkRTIGFmLXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQHDAdT\nZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnIye77j6ev40\n8wRPyN2OdKFSUfI9jB20Or2RLO+RDoL43+USXdrze0Wv4HMRLqaen9BcmCfaKMp0\nE4SFo47bXK/O17r6G8eyq1sqnHE+v288mWtYH9lAlSamNFRF6YwA7zncmE/iKL8J\n0vePHMHP/B6svw8LULZCk+nZk3tgxQn2+r0B4FOz+RmpkoVddfqqUPMbKUxhM2wf\nfO7F6bJaUXDNMBPhCn/3ayKCjYr49ErmnpYV2ZVs1i34S+LFq39J7kyv6zAgbHv9\n+/MtRMoRB1CjpqW0jIOZkHBdYcd1o9p1zFn591Do1wPkmMsWdjIYj+6e7UXcHvOB\n2+ScIRAcnwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQGtq2W\nYSyMMxpdQ3IZvcGE+nyZqTAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD\nggEBAEgoP3ixJsKSD5FN8dQ01RNHERl/IFbA7TRXfwC+L1yFocKnQh4Mp/msPRSV\n+OeHIvemPW/wtZDJzLTOFJ6eTolGekHK1GRTQ6ZqsWiU2fmiOP8ks4oSpI+tQ9Lw\nVrfZqTiEcS5wEIqyfUAZZfKDo7W1xp+dQWzfczSBuZJZwI5iaha7+ILM0r8Ckden\nTVTapc5pLSoO15v0ziRuQ2bT3V3nwu/U0MRK44z+VWOJdSiKxdnOYDs8hFNnKhfe\nklbTZF7kW7WbiNYB43OaAQBJ6BALZsIskEaqfeZT8FD71uN928TcEQyBDXdZpRN+\niGQZDGhht0r0URGMDSs9waJtTfA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF/jCCA+agAwIBAgIQXY/dmS+72lZPranO2JM9jjANBgkqhkiG9w0BAQwFADCB\nlzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\nbWF6b24gUkRTIGFwLWVhc3QtMSBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTI1MjEzNDUxWhgPMjEyMTA1MjUyMjM0NTFaMIGXMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\nbiBSRFMgYXAtZWFzdC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMyW9kBJjD/hx8e8\nb5E1sF42bp8TXsz1htSYE3Tl3T1Aq379DfEhB+xa/ASDZxt7/vwa81BkNo4M6HYq\nokYIXeE7cu5SnSgjWXqcERhgPevtAwgmhdE3yREe8oz2DyOi2qKKZqah+1gpPaIQ\nfK0uAqoeQlyHosye3KZZKkDHBatjBsQ5kf8lhuf7wVulEZVRHY2bP2X7N98PfbpL\nQdH7mWXzDtJJ0LiwFwds47BrkgK1pkHx2p1mTo+HMkfX0P6Fq1atkVC2RHHtbB/X\niYyH7paaHBzviFrhr679zNqwXIOKlbf74w3mS11P76rFn9rS1BAH2Qm6eY5S/Fxe\nHEKXm4kjPN63Zy0p3yE5EjPt54yPkvumOnT+RqDGJ2HCI9k8Ehcbve0ogfdRKNqQ\nVHWYTy8V33ndQRHZlx/CuU1yN61TH4WSoMly1+q1ihTX9sApmlQ14B2pJi/9DnKW\ncwECrPy1jAowC2UJ45RtC8UC05CbP9yrIy/7Noj8gQDiDOepm+6w1g6aNlWoiuQS\nkyI6nzz1983GcnOHya73ga7otXo0Qfg9jPghlYiMomrgshlSLDHZG0Ib/3hb8cnR\n1OcN9FpzNmVK2Ll1SmTMLrIhuCkyNYX9O/bOknbcf706XeESxGduSkHEjIw/k1+2\nAtteoq5dT6cwjnJ9hyhiueVlVkiDAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8w\nHQYDVR0OBBYEFLUI+DD7RJs+0nRnjcwIVWzzYSsFMA4GA1UdDwEB/wQEAwIBhjAN\nBgkqhkiG9w0BAQwFAAOCAgEAb1mcCHv4qMQetLGTBH9IxsB2YUUhr5dda0D2BcHr\nUtDbfd0VQs4tux6h/6iKwHPx0Ew8fuuYj99WknG0ffgJfNc5/fMspxR/pc1jpdyU\n5zMQ+B9wi0lOZPO9uH7/pr+d2odcNEy8zAwqdv/ihsTwLmGP54is9fVbsgzNW1cm\nHKAVL2t/Ope+3QnRiRilKCN1lzhav4HHdLlN401TcWRWKbEuxF/FgxSO2Hmx86pj\ne726lweCTMmnq/cTsPOVY0WMjs0or3eHDVlyLgVeV5ldyN+ptg3Oit60T05SRa58\nAJPTaVKIcGQ/gKkKZConpu7GDofT67P/ox0YNY57LRbhsx9r5UY4ROgz7WMQ1yoS\nY+19xizm+mBm2PyjMUbfwZUyCxsdKMwVdOq5/UmTmdms+TR8+m1uBHPOTQ2vKR0s\nPd/THSzPuu+d3dbzRyDSLQbHFFneG760CUlD/ZmzFlQjJ89/HmAmz8IyENq+Sjhx\nJgzy+FjVZb8aRUoYLlnffpUpej1n87Ynlr1GrvC4GsRpNpOHlwuf6WD4W0qUTsC/\nC9JO+fBzUj/aWlJzNcLEW6pte1SB+EdkR2sZvWH+F88TxemeDrV0jKJw5R89CDf8\nZQNfkxJYjhns+YeV0moYjqQdc7tq4i04uggEQEtVzEhRLU5PE83nlh/K2NZZm8Kj\ndIA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/zCCAuegAwIBAgIRAPVSMfFitmM5PhmbaOFoGfUwDQYJKoZIhvcNAQELBQAw\ngZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\nQW1hem9uIFJEUyB1cy1lYXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyNTIyMzQ1N1oYDzIwNjEwNTI1MjMzNDU3WjCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIHVzLWVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDu9H7TBeGoDzMr\ndxN6H8COntJX4IR6dbyhnj5qMD4xl/IWvp50lt0VpmMd+z2PNZzx8RazeGC5IniV\n5nrLg0AKWRQ2A/lGGXbUrGXCSe09brMQCxWBSIYe1WZZ1iU1IJ/6Bp4D2YEHpXrW\nbPkOq5x3YPcsoitgm1Xh8ygz6vb7PsvJvPbvRMnkDg5IqEThapPjmKb8ZJWyEFEE\nQRrkCIRueB1EqQtJw0fvP4PKDlCJAKBEs/y049FoOqYpT3pRy0WKqPhWve+hScMd\n6obq8kxTFy1IHACjHc51nrGII5Bt76/MpTWhnJIJrCnq1/Uc3Qs8IVeb+sLaFC8K\nDI69Sw6bAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE7PCopt\nlyOgtXX0Y1lObBUxuKaCMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\nAQEAFj+bX8gLmMNefr5jRJfHjrL3iuZCjf7YEZgn89pS4z8408mjj9z6Q5D1H7yS\njNETVV8QaJip1qyhh5gRzRaArgGAYvi2/r0zPsy+Tgf7v1KGL5Lh8NT8iCEGGXwF\ng3Ir+Nl3e+9XUp0eyyzBIjHtjLBm6yy8rGk9p6OtFDQnKF5OxwbAgip42CD75r/q\np421maEDDvvRFR4D+99JZxgAYDBGqRRceUoe16qDzbMvlz0A9paCZFclxeftAxv6\nQlR5rItMz/XdzpBJUpYhdzM0gCzAzdQuVO5tjJxmXhkSMcDP+8Q+Uv6FA9k2VpUV\nE/O5jgpqUJJ2Hc/5rs9VkAPXeA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrzCCAjWgAwIBAgIQW0yuFCle3uj4vWiGU0SaGzAKBggqhkjOPQQDAzCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIGFmLXNvdXRoLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTE5MTkzNTE2WhgPMjEyMTA1MTkyMDM1MTZaMIGXMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpvbiBS\nRFMgYWYtc291dGgtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2VhdHRs\nZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDPiKNZSaXs3Un/J/v+LTsFDANHpi7en\noL2qh0u0DoqNzEBTbBjvO23bLN3k599zh6CY3HKW0r2k1yaIdbWqt4upMCRCcUFi\nI4iedAmubgzh56wJdoMZztjXZRwDthTkJKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAd\nBgNVHQ4EFgQUWbYkcrvVSnAWPR5PJhIzppcAnZIwDgYDVR0PAQH/BAQDAgGGMAoG\nCCqGSM49BAMDA2gAMGUCMCESGqpat93CjrSEjE7z+Hbvz0psZTHwqaxuiH64GKUm\nmYynIiwpKHyBrzjKBmeDoQIxANGrjIo6/b8Jl6sdIZQI18V0pAyLfLiZjlHVOnhM\nMOTVgr82ZuPoEHTX78MxeMnYlw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgIRAIbsx8XOl0sgTNiCN4O+18QwDQYJKoZIhvcNAQELBQAw\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBhcC1ub3J0aGVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAO\nBgNVBAcMB1NlYXR0bGUwIBcNMjEwNTI1MjE1NDU4WhgPMjA2MTA1MjUyMjU0NTha\nMIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\nSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\nLEFtYXpvbiBSRFMgYXAtbm9ydGhlYXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\nDgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\ntROxwXWCgn5R9gI/2Ivjzaxc0g95ysBjoJsnhPdJEHQb7w3y2kWrVWU3Y9fOitgb\nCEsnEC3PrhRnzNVW0fPsK6kbvOeCmjvY30rdbxbc8h+bjXfGmIOgAkmoULEr6Hc7\nG1Q/+tvv4lEwIs7bEaf+abSZxRJbZ0MBxhbHn7UHHDiMZYvzK+SV1MGCxx7JVhrm\nxWu3GC1zZCsGDhB9YqY9eR6PmjbqA5wy8vqbC57dZZa1QVtWIQn3JaRXn+faIzHx\nnLMN5CEWihsdmHBXhnRboXprE/OS4MFv1UrQF/XM/h5RBeCywpHePpC+Oe1T3LNC\niP8KzRFrjC1MX/WXJnmOVQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\nDgQWBBS33XbXAUMs1znyZo4B0+B3D68WFTAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\nhvcNAQELBQADggEBADuadd2EmlpueY2VlrIIPC30QkoA1EOSoCmZgN6124apkoY1\nHiV4r+QNPljN4WP8gmcARnNkS7ZeR4fvWi8xPh5AxQCpiaBMw4gcbTMCuKDV68Pw\nP2dZCTMspvR3CDfM35oXCufdtFnxyU6PAyINUqF/wyTHguO3owRFPz64+sk3r2pT\nWHmJjG9E7V+KOh0s6REgD17Gqn6C5ijLchSrPUHB0wOIkeLJZndHxN/76h7+zhMt\nfFeNxPWHY2MfpcaLjz4UREzZPSB2U9k+y3pW1omCIcl6MQU9itGx/LpQE+H3ZeX2\nM2bdYd5L+ow+bdbGtsVKOuN+R9Dm17YpswF+vyQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nEm4Hy3A=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBDCCAuygAwIBAgIQFn6AJ+uxaPDpNVx7174CpjANBgkqhkiG9w0BAQsFADCB\nmjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\nbWF6b24gUkRTIGlsLWNlbnRyYWwtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNV\nBAcMB1NlYXR0bGUwIBcNMjIxMjAyMjAxNDA4WhgPMjA2MjEyMDIyMTE0MDhaMIGa\nMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5j\nLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMzAxBgNVBAMMKkFt\nYXpvbiBSRFMgaWwtY2VudHJhbC0xIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UE\nBwwHU2VhdHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL2xGTSJ\nfXorki/dkkTqdLyv4U1neeFYEyUCPN/HJ7ZloNwhj8RBrHYhZ4qtvUAvN+rs8fUm\nL0wmaL69ye61S+CSfDzNwBDGwOzUm/cc1NEJOHCm8XA0unBNBvpJTjsFk2LQ+rz8\noU0lVV4mjnfGektrTDeADonO1adJvUTYmF6v1wMnykSkp8AnW9EG/6nwcAJuAJ7d\nBfaLThm6lfxPdsBNG81DLKi2me2TLQ4yl+vgRKJi2fJWwA77NaDqQuD5upRIcQwt\n5noJt2kFFmeiro98ZMMRaDTHAHhJfWkwkw5f2QNIww7T4r85IwbQCgJVRo4m4ZTC\nW/1eiEccU2407mECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU\nDNhVvGHzKXv0Yh6asK0apP9jJlUwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\nCwUAA4IBAQCoEVTUY/rF9Zrlpb1Y1hptEguw0i2pCLakcmv3YNj6thsubbGeGx8Z\nRjUA/gPKirpoae2HU1y64WEu7akwr6pdTRtXXjbe9NReT6OW/0xAwceSXCOiStqS\ncMsWWTGg6BA3uHqad5clqITjDZr1baQ8X8en4SXRBxXyhJXbOkB60HOQeFR9CNeh\npJdrWLeNYXwU0Z59juqdVMGwvDAYdugWUhW2rhafVUXszfRA5c8Izc+E31kq90aY\nLmxFXUHUfG0eQOmxmg+Z/nG7yLUdHIFA3id8MRh22hye3KvRdQ7ZVGFni0hG2vQQ\nQ01AvD/rhzyjg0czzJKLK9U/RttwdMaV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\njGKc3k6UNxpg\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\n0Ws=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICtDCCAjqgAwIBAgIRAMyaTlVLN0ndGp4ffwKAfoMwCgYIKoZIzj0EAwMwgZkx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEyMDAGA1UEAwwpQW1h\nem9uIFJEUyBtZS1jZW50cmFsLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjIwNTA3MDA0NDM3WhgPMjEyMjA1MDcwMTQ0MzdaMIGZMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMjAwBgNVBAMMKUFtYXpv\nbiBSRFMgbWUtY2VudHJhbC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdT\nZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE19nCV1nsI6CohSor13+B25cr\nzg+IHdi9Y3L7ziQnHWI6yjBazvnKD+oC71aRRlR8b5YXsYGUQxWzPLHN7EGPcSGv\nbzA9SLG1KQYCJaQ0m9Eg/iGrwKWOgylbhVw0bCxoo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MB0GA1UdDgQWBBS4KsknsJXM9+QPEkBdZxUPaLr11zAOBgNVHQ8BAf8EBAMC\nAYYwCgYIKoZIzj0EAwMDaAAwZQIxAJaRgrYIEfXQMZQQDxMTYS0azpyWSseQooXo\nL3nYq4OHGBgYyQ9gVjvRYWU85PXbfgIwdi82DtANQFkCu+j+BU0JBY/uRKPEeYzo\nJG92igKIcXPqCoxIJ7lJbbzmuf73gQu5\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nTspdjbg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgIRAJZFh4s9aZGzKaTMLrSb4acwDQYJKoZIhvcNAQELBQAw\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBCZXRhIHVzLWVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAO\nBgNVBAcMB1NlYXR0bGUwIBcNMjEwNTE4MjEyODQxWhgPMjA2MTA1MTgyMjI4NDFa\nMIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\nSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\nLEFtYXpvbiBSRFMgQmV0YSB1cy1lYXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\nDgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n17i2yoU6diep+WrqxIn2CrDEO2NdJVwWTSckx4WMZlLpkQDoymSmkNHjq9ADIApD\nA31Cx+843apL7wub8QkFZD0Tk7/ThdHWJOzcAM3ov98QBPQfOC1W5zYIIRP2F+vQ\nTRETHQnLcW3rLv0NMk5oQvIKpJoC9ett6aeVrzu+4cU4DZVWYlJUoC/ljWzCluau\n8blfW0Vwin6OB7s0HCG5/wijQWJBU5SrP/KAIPeQi1GqG5efbqAXDr/ple0Ipwyo\nXjjl73LenGUgqpANlC9EAT4i7FkJcllLPeK3NcOHjuUG0AccLv1lGsHAxZLgjk/x\nz9ZcnVV9UFWZiyJTKxeKPwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\nDgQWBBRWyMuZUo4gxCR3Luf9/bd2AqZ7CjAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\nhvcNAQELBQADggEBAIqN2DlIKlvDFPO0QUZQVFbsi/tLdYM98/vvzBpttlTGVMyD\ngJuQeHVz+MnhGIwoCGOlGU3OOUoIlLAut0+WG74qYczn43oA2gbMd7HoD7oL/IGg\nnjorBwJVcuuLv2G//SqM3nxGcLRtkRnQ+lvqPxMz9+0fKFUn6QcIDuF0QSfthLs2\nWSiGEPKO9c9RSXdRQ4pXA7c3hXng8P4A2ZmdciPne5Nu4I4qLDGZYRrRLRkNTrOi\nTyS6r2HNGUfgF7eOSeKt3NWL+mNChcYj71/Vycf5edeczpUgfnWy9WbPrK1svKyl\naAs2xg+X6O8qB+Mnj2dNBzm+lZIS3sIlm+nO9sg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjSgAwIBAgIRAPAlEk8VJPmEzVRRaWvTh2AwCgYIKoZIzj0EAwMwgZYx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\nem9uIFJEUyB1cy1lYXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTI1MjI0MTU1WhgPMjEyMTA1MjUyMzQxNTVaMIGWMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\nRFMgdXMtZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEx5xjrup8II4HOJw15NTnS3H5yMrQGlbj\nEDA5MMGnE9DmHp5dACIxmPXPMe/99nO7wNdl7G71OYPCgEvWm0FhdvVUeTb3LVnV\nBnaXt32Ek7/oxGk1T+Df03C+W0vmuJ+wo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\nA1UdDgQWBBTGXmqBWN/1tkSea4pNw0oHrjk2UDAOBgNVHQ8BAf8EBAMCAYYwCgYI\nKoZIzj0EAwMDaAAwZQIxAIqqZWCSrIkZ7zsv/FygtAusW6yvlL935YAWYPVXU30m\njkMFLM+/RJ9GMvnO8jHfCgIwB+whlkcItzE9CRQ6CsMo/d5cEHDUu/QW6jSIh9BR\nOGh9pTYPVkUbBiKPA7lVVhre\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nnWS0\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICtDCCAjmgAwIBAgIQKKqVZvk6NsLET+uYv5myCzAKBggqhkjOPQQDAzCBmTEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTIwMAYDVQQDDClBbWF6\nb24gUkRTIGlsLWNlbnRyYWwtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwH\nU2VhdHRsZTAgFw0yMjEyMDIyMDMyMjBaGA8yMTIyMTIwMjIxMzIyMFowgZkxCzAJ\nBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMw\nEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEyMDAGA1UEAwwpQW1hem9u\nIFJEUyBpbC1jZW50cmFsLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASYwfvj8BmvLAP6UkNQ4X4dXBB/\nwebBO7swW+8HnFN2DAu+Cn/lpcDpu+dys1JmkVX435lrCH3oZjol0kCDIM1lF4Cv\n+78yoY1Jr/YMat22E4iz4AZd9q0NToS7+ZA0r2yjQjBAMA8GA1UdEwEB/wQFMAMB\nAf8wHQYDVR0OBBYEFO/8Py16qPr7J2GWpvxlTMB+op7XMA4GA1UdDwEB/wQEAwIB\nhjAKBggqhkjOPQQDAwNpADBmAjEAwk+rg788+u8JL6sdix7l57WTo8E/M+o3TO5x\nuRuPdShrBFm4ArGR2PPs4zCQuKgqAjEAi0TA3PVqAxKpoz+Ps8/054p9WTgDfBFZ\ni/lm2yTaPs0xjY6FNWoy7fsVw5oEKxOn\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGCTCCA/GgAwIBAgIRAOY7gfcBZgR2tqfBzMbFQCUwDQYJKoZIhvcNAQEMBQAw\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtNCBSb290IENBIFJTQTQwOTYgRzExEDAO\nBgNVBAcMB1NlYXR0bGUwIBcNMjIwNTI1MTY1NDU5WhgPMjEyMjA1MjUxNzU0NTla\nMIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\nSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\nLEFtYXpvbiBSRFMgYXAtc291dGhlYXN0LTQgUm9vdCBDQSBSU0E0MDk2IEcxMRAw\nDgYDVQQHDAdTZWF0dGxlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA\nlfxER43FuLRdL08bddF0YhbCP+XXKj1A/TFMXmd2My8XDei8rPXFYyyjMig9+xZw\nuAsIxLwz8uiA26CKA8bCZKg5VG2kTeOJAfvBJaLv1CZefs3Z4Uf1Sjvm6MF2yqEj\nGoORfyfL9HiZFTDuF/hcjWoKYCfMuG6M/wO8IbdICrX3n+BiYQJu/pFO660Mg3h/\n8YBBWYDbHoCiH/vkqqJugQ5BM3OI5nsElW51P1icEEqti4AZ7JmtSv9t7fIFBVyR\noaEyOgpp0sm193F/cDJQdssvjoOnaubsSYm1ep3awZAUyGN/X8MBrPY95d0hLhfH\nEhc5Icyg+hsosBljlAyksmt4hFQ9iBnWIz/ZTfGMck+6p3HVL9RDgvluez+rWv59\n8q7omUGsiPApy5PDdwI/Wt/KtC34/2sjslIJfvgifdAtkRPkhff1WEwER00ADrN9\neGGInaCpJfb1Rq8cV2n00jxg7DcEd65VR3dmIRb0bL+jWK62ni/WdEyomAOMfmGj\naWf78S/4rasHllWJ+QwnaUYY3u6N8Cgio0/ep4i34FxMXqMV3V0/qXdfhyabi/LM\nwCxNo1Dwt+s6OtPJbwO92JL+829QAxydfmaMTeHBsgMPkG7RwAekeuatKGHNsc2Z\nx2Q4C2wVvOGAhcHwxfM8JfZs3nDSZJndtVVnFlUY0UECAwEAAaNCMEAwDwYDVR0T\nAQH/BAUwAwEB/zAdBgNVHQ4EFgQUpnG7mWazy6k97/tb5iduRB3RXgQwDgYDVR0P\nAQH/BAQDAgGGMA0GCSqGSIb3DQEBDAUAA4ICAQCDLqq1Wwa9Tkuv7vxBnIeVvvFF\necTn+P+wJxl9Qa2ortzqTHZsBDyJO62d04AgBwiDXkJ9a+bthgG0H1J7Xee8xqv1\nxyX2yKj24ygHjspLotKP4eDMdDi5TYq+gdkbPmm9Q69B1+W6e049JVGXvWG8/7kU\nigxeuCYwtCCdUPRLf6D8y+1XMGgVv3/DSOHWvTg3MJ1wJ3n3+eve3rjGdRYWZeJu\nk21HLSZYzVrCtUsh2YAeLnUbSxVuT2Xr4JehYe9zW5HEQ8Je/OUfnCy9vzoN/ITw\nosAH+EBJQey7RxEDqMwCaRefH0yeHFcnOll0OXg/urnQmwbEYzQ1uutJaBPsjU0J\nQf06sMxI7GiB5nPE+CnI2sM6A9AW9kvwexGXpNJiLxF8dvPQthpOKGcYu6BFvRmt\n6ctfXd9b7JJoVqMWuf5cCY6ihpk1e9JTlAqu4Eb/7JNyGiGCR40iSLvV28un9wiE\nplrdYxwcNYq851BEu3r3AyYWw/UW1AKJ5tM+/Gtok+AphMC9ywT66o/Kfu44mOWm\nL3nSLSWEcgfUVgrikpnyGbUnGtgCmHiMlUtNVexcE7OtCIZoVAlCGKNu7tyuJf10\nQlk8oIIzfSIlcbHpOYoN79FkLoDNc2er4Gd+7w1oPQmdAB0jBJnA6t0OUBPKdDdE\nUfff2jrbfbzECn1ELg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nfejbXelUSJSzDIdY\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGCTCCA/GgAwIBAgIRAN7Y9G9i4I+ZaslPobE7VL4wDQYJKoZIhvcNAQEMBQAw\ngZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\nQW1hem9uIFJEUyBhcC1ub3J0aGVhc3QtMiBSb290IENBIFJTQTQwOTYgRzExEDAO\nBgNVBAcMB1NlYXR0bGUwIBcNMjEwNTIwMTYzMzIzWhgPMjEyMTA1MjAxNzMzMjNa\nMIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\nSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\nLEFtYXpvbiBSRFMgYXAtbm9ydGhlYXN0LTIgUm9vdCBDQSBSU0E0MDk2IEcxMRAw\nDgYDVQQHDAdTZWF0dGxlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA\n4BEPCiIfiK66Q/qa8k+eqf1Q3qsa6Xuu/fPkpuStXVBShhtXd3eqrM0iT4Xxs420\nVa0vSB3oZ7l86P9zYfa60n6PzRxdYFckYX330aI7L/oFIdaodB/C9szvROI0oLG+\n6RwmIF2zcprH0cTby8MiM7G3v9ykpq27g4WhDC1if2j8giOQL3oHpUaByekZNIHF\ndIllsI3RkXmR3xmmxoOxJM1B9MZi7e1CvuVtTGOnSGpNCQiqofehTGwxCN2wFSK8\nxysaWlw48G0VzZs7cbxoXMH9QbMpb4tpk0d+T8JfAPu6uWO9UwCLWWydf0CkmA/+\nD50/xd1t33X9P4FEaPSg5lYbHXzSLWn7oLbrN2UqMLaQrkoEBg/VGvzmfN0mbflw\n+T87bJ/VEOVNlG+gepyCTf89qIQVWOjuYMox4sK0PjzZGsYEuYiq1+OUT3vk/e5K\nag1fCcq2Isy4/iwB2xcXrsQ6ljwdk1fc+EmOnjGKrhuOHJY3S+RFv4ToQBsVyYhC\nXGaC3EkqIX0xaCpDimxYhFjWhpDXAjG/zJ+hRLDAMCMhl/LPGRk/D1kzSbPmdjpl\nlEMK5695PeBvEBTQdBQdOiYgOU3vWU6tzwwHfiM2/wgvess/q0FDAHfJhppbgbb9\n3vgsIUcsvoC5o29JvMsUxsDRvsAfEmMSDGkJoA/X6GECAwEAAaNCMEAwDwYDVR0T\nAQH/BAUwAwEB/zAdBgNVHQ4EFgQUgEWm1mZCbGD6ytbwk2UU1aLaOUUwDgYDVR0P\nAQH/BAQDAgGGMA0GCSqGSIb3DQEBDAUAA4ICAQBb4+ABTGBGwxK1U/q4g8JDqTQM\n1Wh8Oz8yAk4XtPJMAmCctxbd81cRnSnePWw/hxViLVtkZ/GsemvXfqAQyOn1coN7\nQeYSw+ZOlu0j2jEJVynmgsR7nIRqE7QkCyZAU+d2FTJUfmee+IiBiGyFGgxz9n7A\nJhBZ/eahBbiuoOik/APW2JWLh0xp0W0GznfJ8lAlaQTyDa8iDXmVtbJg9P9qzkvl\nFgPXQttzEOyooF8Pb2LCZO4kUz+1sbU7tHdr2YE+SXxt6D3SBv+Yf0FlvyWLiqVk\nGDEOlPPTDSjAWgKnqST8UJ0RDcZK/v1ixs7ayqQJU0GUQm1I7LGTErWXHMnCuHKe\nUKYuiSZwmTcJ06NgdhcCnGZgPq13ryMDqxPeltQc3n5eO7f1cL9ERYLDLOzm6A9P\noQ3MfcVOsbHgGHZWaPSeNrQRN9xefqBXH0ZPasgcH9WJdsLlEjVUXoultaHOKx3b\nUCCb+d3EfqF6pRT488ippOL6bk7zNubwhRa/+y4wjZtwe3kAX78ACJVcjPobH9jZ\nErySads5zdQeaoee5wRKdp3TOfvuCe4bwLRdhOLCHWzEcXzY3g/6+ppLvNom8o+h\nBh5X26G6KSfr9tqhQ3O9IcbARjnuPbvtJnoPY0gz3EHHGPhy0RNW8i2gl3nUp0ah\nPtjwbKW0hYAhIttT0Q==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICtzCCAj2gAwIBAgIQQRBQTs6Y3H1DDbpHGta3lzAKBggqhkjOPQQDAzCBmzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\nb24gUkRTIGFwLXNvdXRoZWFzdC0zIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDYxMTAwMTI0M1oYDzIxMjEwNjExMDExMjQzWjCBmzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\nb24gUkRTIGFwLXNvdXRoZWFzdC0zIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEs0942Xj4m/gKA+WA6F5h\nAHYuek9eGpzTRoLJddM4rEV1T3eSueytMVKOSlS3Ub9IhyQrH2D8EHsLYk9ktnGR\npATk0kCYTqFbB7onNo070lmMJmGT/Q7NgwC8cySChFxbo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MB0GA1UdDgQWBBQ20iKBKiNkcbIZRu0y1uoF1yJTEzAOBgNVHQ8BAf8E\nBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwYv0wTSrpQTaPaarfLN8Xcqrqu3hzl07n\nFrESIoRw6Cx77ZscFi2/MV6AFyjCV/TlAjEAhpwJ3tpzPXpThRML8DMJYZ3YgMh3\nCMuLqhPpla3cL0PhybrD27hJWl29C4el6aMO\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrDCCAjOgAwIBAgIQGcztRyV40pyMKbNeSN+vXTAKBggqhkjOPQQDAzCBljEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMS8wLQYDVQQDDCZBbWF6\nb24gUkRTIHVzLWVhc3QtMiBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTAgFw0yMTA1MjEyMzE1NTZaGA8yMTIxMDUyMjAwMTU1NlowgZYxCzAJBgNV\nBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYD\nVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1hem9uIFJE\nUyB1cy1lYXN0LTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1NlYXR0bGUw\ndjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQfDcv+GGRESD9wT+I5YIPRsD3L+/jsiIis\nTr7t9RSbFl+gYpO7ZbDXvNbV5UGOC5lMJo/SnqFRTC6vL06NF7qOHfig3XO8QnQz\n6T5uhhrhnX2RSY3/10d2kTyHq3ZZg3+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\nVR0OBBYEFLDyD3PRyNXpvKHPYYxjHXWOgfPnMA4GA1UdDwEB/wQEAwIBhjAKBggq\nhkjOPQQDAwNnADBkAjB20HQp6YL7CqYD82KaLGzgw305aUKw2aMrdkBR29J183jY\n6Ocj9+Wcif9xnRMS+7oCMAvrt03rbh4SU9BohpRUcQ2Pjkh7RoY0jDR4Xq4qzjNr\n5UFr3BXpFvACxXF51BksGQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjWgAwIBAgIQeKbS5zvtqDvRtwr5H48cAjAKBggqhkjOPQQDAzCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIG1lLXNvdXRoLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTIwMTcxOTU1WhgPMjEyMTA1MjAxODE5NTVaMIGXMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpvbiBS\nRFMgbWUtc291dGgtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2VhdHRs\nZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABEKjgUaAPmUlRMEQdBC7BScAGosJ1zRV\nLDd38qTBjzgmwBfQJ5ZfGIvyEK5unB09MB4e/3qqK5I/L6Qn5Px/n5g4dq0c7MQZ\nu7G9GBYm90U3WRJBf7lQrPStXaRnS4A/O6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAd\nBgNVHQ4EFgQUNKcAbGEIn03/vkwd8g6jNyiRdD4wDgYDVR0PAQH/BAQDAgGGMAoG\nCCqGSM49BAMDA2cAMGQCMHIeTrjenCSYuGC6txuBt/0ZwnM/ciO9kHGWVCoK8QLs\njGghb5/YSFGZbmQ6qpGlSAIwVOQgdFfTpEfe5i+Vs9frLJ4QKAfc27cTNYzRIM0I\nE+AJgK4C4+DiyyMzOpiCfmvq\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nWT1QcNdw7ntUJP/w\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrzCCAjWgAwIBAgIQARky6+5PNFRkFVOp3Ob1CTAKBggqhkjOPQQDAzCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIGV1LXNvdXRoLTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjIwNTIzMTg0MTI4WhgPMjEyMjA1MjMxOTQxMjdaMIGXMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpvbiBS\nRFMgZXUtc291dGgtMiBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2VhdHRs\nZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABNVGL5oF7cfIBxKyWd2PVK/S5yQfaJY3\nQFHWvEdt6951n9JhiiPrHzfVHsxZp1CBjILRMzjgRbYWmc8qRoLkgGE7htGdwudJ\nFa/WuKzO574Prv4iZXUnVGTboC7JdvKbh6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAd\nBgNVHQ4EFgQUgDeIIEKynwUbNXApdIPnmRWieZwwDgYDVR0PAQH/BAQDAgGGMAoG\nCCqGSM49BAMDA2gAMGUCMEOOJfucrST+FxuqJkMZyCM3gWGZaB+/w6+XUAJC6hFM\nuSTY0F44/bERkA4XhH+YGAIxAIpJQBakCA1/mXjsTnQ+0El9ty+LODp8ibkn031c\n8DKDS7pR9UK7ZYdR6zFg3ZCjQw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjOgAwIBAgIQJvkWUcYLbnxtuwnyjMmntDAKBggqhkjOPQQDAzCBljEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMS8wLQYDVQQDDCZBbWF6\nb24gUkRTIGV1LXdlc3QtMyBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTAgFw0yMTA1MjUyMjI2MTJaGA8yMTIxMDUyNTIzMjYxMlowgZYxCzAJBgNV\nBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYD\nVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1hem9uIFJE\nUyBldS13ZXN0LTMgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1NlYXR0bGUw\ndjAQBgcqhkjOPQIBBgUrgQQAIgNiAARENn8uHCyjn1dFax4OeXxvbV861qsXFD9G\nDshumTmFzWWHN/69WN/AOsxy9XN5S7Cgad4gQgeYYYgZ5taw+tFo/jQvCLY//uR5\nuihcLuLJ78opvRPvD9kbWZ6oXfBtFkWjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\nVR0OBBYEFKiK3LpoF+gDnqPldGSwChBPCYciMA4GA1UdDwEB/wQEAwIBhjAKBggq\nhkjOPQQDAwNpADBmAjEA+7qfvRlnvF1Aosyp9HzxxCbN7VKu+QXXPhLEBWa5oeWW\nUOcifunf/IVLC4/FGCsLAjEAte1AYp+iJyOHDB8UYkhBE/1sxnFaTiEPbvQBU0wZ\nSuwWVLhu2wWDuSW+K7tTuL8p\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/zCCAuegAwIBAgIRAKeDpqX5WFCGNo94M4v69sUwDQYJKoZIhvcNAQELBQAw\ngZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\nQW1hem9uIFJEUyBldS13ZXN0LTMgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyNTIyMTgzM1oYDzIwNjEwNTI1MjMxODMzWjCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIGV1LXdlc3QtMyBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCcKOTEMTfzvs4H\nWtJR8gI7GXN6xesulWtZPv21oT+fLGwJ+9Bv8ADCGDDrDxfeH/HxJmzG9hgVAzVn\n4g97Bn7q07tGZM5pVi96/aNp11velZT7spOJKfJDZTlGns6DPdHmx48whpdO+dOb\n6+eR0VwCIv+Vl1fWXgoACXYCoKjhxJs+R+fwY//0JJ1YG8yjZ+ghLCJmvlkOJmE1\nTCPUyIENaEONd6T+FHGLVYRRxC2cPO65Jc4yQjsXvvQypoGgx7FwD5voNJnFMdyY\n754JGPOOe/SZdepN7Tz7UEq8kn7NQSbhmCsgA/Hkjkchz96qN/YJ+H/okiQUTNB0\neG9ogiVFAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFjayw9Y\nMjbxfF14XAhMM2VPl0PfMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\nAQEAAtmx6d9+9CWlMoU0JCirtp4dSS41bBfb9Oor6GQ8WIr2LdfZLL6uES/ubJPE\n1Sh5Vu/Zon5/MbqLMVrfniv3UpQIof37jKXsjZJFE1JVD/qQfRzG8AlBkYgHNEiS\nVtD4lFxERmaCkY1tjKB4Dbd5hfhdrDy29618ZjbSP7NwAfnwb96jobCmMKgxVGiH\nUqsLSiEBZ33b2hI7PJ6iTJnYBWGuiDnsWzKRmheA4nxwbmcQSfjbrNwa93w3caL2\nv/4u54Kcasvcu3yFsUwJygt8z43jsGAemNZsS7GWESxVVlW93MJRn6M+MMakkl9L\ntWaXdHZ+KUV7LhfYLb0ajvb40w==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBDCCAuygAwIBAgIQJ5oxPEjefCsaESSwrxk68DANBgkqhkiG9w0BAQsFADCB\nmjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\nbWF6b24gUkRTIGV1LWNlbnRyYWwtMiBSb290IENBIFJTQTIwNDggRzExEDAOBgNV\nBAcMB1NlYXR0bGUwIBcNMjIwNjA2MjExNzA1WhgPMjA2MjA2MDYyMjE3MDVaMIGa\nMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5j\nLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMzAxBgNVBAMMKkFt\nYXpvbiBSRFMgZXUtY2VudHJhbC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UE\nBwwHU2VhdHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALTQt5eX\ng+VP3BjO9VBkWJhE0GfLrU/QIk32I6WvrnejayTrlup9H1z4QWlXF7GNJrqScRMY\nKhJHlcP05aPsx1lYco6pdFOf42ybXyWHHJdShj4A5glU81GTT+VrXGzHSarLmtua\neozkQgPpDsSlPt0RefyTyel7r3Cq+5K/4vyjCTcIqbfgaGwTU36ffjM1LaPCuE4O\nnINMeD6YuImt2hU/mFl20FZ+IZQUIFZZU7pxGLqTRz/PWcH8tDDxnkYg7tNuXOeN\nJbTpXrw7St50/E9ZQ0llGS+MxJD8jGRAa/oL4G/cwnV8P2OEPVVkgN9xDDQeieo0\n3xkzolkDkmeKOnUCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU\nbwu8635iQGQMRanekesORM8Hkm4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\nCwUAA4IBAQAgN6LE9mUgjsj6xGCX1afYE69fnmCjjb0rC6eEe1mb/QZNcyw4XBIW\n6+zTXo4mjZ4ffoxb//R0/+vdTE7IvaLgfAZgFsLKJCtYDDstXZj8ujQnGR9Pig3R\nW+LpNacvOOSJSawNQq0Xrlcu55AU4buyD5VjcICnfF1dqBMnGTnh27m/scd/ZMx/\nkapHZ/fMoK2mAgSX/NvUKF3UkhT85vSSM2BTtET33DzCPDQTZQYxFBa4rFRmFi4c\nBLlmIReiCGyh3eJhuUUuYAbK6wLaRyPsyEcIOLMQmZe1+gAFm1+1/q5Ke9ugBmjf\nPbTWjsi/lfZ5CdVAhc5lmZj/l5aKqwaS\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjSgAwIBAgIRAKKPTYKln9L4NTx9dpZGUjowCgYIKoZIzj0EAwMwgZYx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\nem9uIFJEUyBldS13ZXN0LTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTIxMjI1NTIxWhgPMjEyMTA1MjEyMzU1MjFaMIGWMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\nRFMgZXUtd2VzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE/owTReDvaRqdmbtTzXbyRmEpKCETNj6O\nhZMKH0F8oU9Tmn8RU7kQQj6xUKEyjLPrFBN7c+26TvrVO1KmJAvbc8bVliiJZMbc\nC0yV5PtJTalvlMZA1NnciZuhxaxrzlK1o0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\nA1UdDgQWBBT4i5HaoHtrs7Mi8auLhMbKM1XevDAOBgNVHQ8BAf8EBAMCAYYwCgYI\nKoZIzj0EAwMDaAAwZQIxAK9A+8/lFdX4XJKgfP+ZLy5ySXC2E0Spoy12Gv2GdUEZ\np1G7c1KbWVlyb1d6subzkQIwKyH0Naf/3usWfftkmq8SzagicKz5cGcEUaULq4tO\nGzA/AMpr63IDBAqkZbMDTCmH\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrzCCAjWgAwIBAgIQTgIvwTDuNWQo0Oe1sOPQEzAKBggqhkjOPQQDAzCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIGV1LW5vcnRoLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTI0MjEwNjM4WhgPMjEyMTA1MjQyMjA2MzhaMIGXMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpvbiBS\nRFMgZXUtbm9ydGgtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2VhdHRs\nZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJuzXLU8q6WwSKXBvx8BbdIi3mPhb7Xo\nrNJBfuMW1XRj5BcKH1ZoGaDGw+BIIwyBJg8qNmCK8kqIb4cH8/Hbo3Y+xBJyoXq/\ncuk8aPrxiNoRsKWwiDHCsVxaK9L7GhHHAqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAd\nBgNVHQ4EFgQUYgcsdU4fm5xtuqLNppkfTHM2QMYwDgYDVR0PAQH/BAQDAgGGMAoG\nCCqGSM49BAMDA2gAMGUCMQDz/Rm89+QJOWJecYAmYcBWCcETASyoK1kbr4vw7Hsg\n7Ew3LpLeq4IRmTyuiTMl0gMCMAa0QSjfAnxBKGhAnYxcNJSntUyyMpaXzur43ec0\n3D8npJghwC4DuICtKEkQiI5cSg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGATCCA+mgAwIBAgIRAORIGqQXLTcbbYT2upIsSnQwDQYJKoZIhvcNAQEMBQAw\ngZgxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwo\nQW1hem9uIFJEUyBldS1zb3V0aC0yIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UE\nBwwHU2VhdHRsZTAgFw0yMjA1MjMxODM0MjJaGA8yMTIyMDUyMzE5MzQyMlowgZgx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwoQW1h\nem9uIFJEUyBldS1zb3V0aC0yIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwH\nU2VhdHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPKukwsW2s/h\n1k+Hf65pOP0knVBnOnMQyT1mopp2XHGdXznj9xS49S30jYoUnWccyXgD983A1bzu\nw4fuJRHg4MFdz/NWTgXvy+zy0Roe83OPIJjUmXnnzwUHQcBa9vl6XUO65iQ3pbSi\nfQfNDFXD8cvuXbkezeADoy+iFAlzhXTzV9MD44GTuo9Z3qAXNGHQCrgRSCL7uRYt\nt1nfwboCbsVRnElopn2cTigyVXE62HzBUmAw1GTbAZeFAqCn5giBWYAfHwTUldRL\n6eEa6atfsS2oPNus4ZENa1iQxXq7ft+pMdNt0qKXTCZiiCZjmLkY0V9kWwHTRRF8\nr+75oSL//3di43QnuSCgjwMRIeWNtMud5jf3eQzSBci+9njb6DrrSUbx7blP0srg\n94/C/fYOp/0/EHH34w99Th14VVuGWgDgKahT9/COychLOubXUT6vD1As47S9KxTv\nyYleVKwJnF9cVjepODN72fNlEf74BwzgSIhUmhksmZSeJBabrjSUj3pdyo/iRZN/\nCiYz9YPQ29eXHPQjBZVIUqWbOVfdwsx0/Xu5T1e7yyXByQ3/oDulahtcoKPAFQ3J\nee6NJK655MdS7pM9hJnU2Rzu3qZ/GkM6YK7xTlMXVouPUZov/VbiaCKbqYDs8Dg+\nUKdeNXAT6+BMleGQzly1X7vjhgeA8ugVAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB\nAf8wHQYDVR0OBBYEFJdaPwpCf78UolFTEn6GO85/QwUIMA4GA1UdDwEB/wQEAwIB\nhjANBgkqhkiG9w0BAQwFAAOCAgEAWkxHIT3mers5YnZRSVjmpxCLivGj1jMB9VYC\niKqTAeIvD0940L0YaZgivQll5pue8UUcQ6M2uCdVVAsNJdmQ5XHIYiGOknYPtxzO\naO+bnZp7VIZw/vJ49hvH6RreA2bbxYMZO/ossYdcWsWbOKHFrRmAw0AhtK/my51g\nobV7eQg+WmlE5Iqc75ycUsoZdc3NimkjBi7LQoNP1HMvlLHlF71UZhQDdq+/WdV7\n0zmg+epkki1LjgMmuPyb+xWuYkFKT1/faX+Xs62hIm5BY+aI4if4RuQ+J//0pOSs\nUajrjTo+jLGB8A96jAe8HaFQenbwMjlaHRDAF0wvbkYrMr5a6EbneAB37V05QD0Y\nRh4L4RrSs9DX2hbSmS6iLDuPEjanHKzglF5ePEvnItbRvGGkynqDVlwF+Bqfnw8l\n0i8Hr1f1/LP1c075UjkvsHlUnGgPbLqA0rDdcxF8Fdlv1BunUjX0pVlz10Ha5M6P\nAdyWUOneOfaA5G7jjv7i9qg3r99JNs1/Lmyg/tV++gnWTAsSPFSSEte81kmPhlK3\n2UtAO47nOdTtk+q4VIRAwY1MaOR7wTFZPfer1mWs4RhKNu/odp8urEY87iIzbMWT\nQYO/4I6BGj9rEWNGncvR5XTowwIthMCj2KWKM3Z/JxvjVFylSf+s+FFfO1bNIm6h\nu3UBpZI=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICtDCCAjmgAwIBAgIQenQbcP/Zbj9JxvZ+jXbRnTAKBggqhkjOPQQDAzCBmTEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTIwMAYDVQQDDClBbWF6\nb24gUkRTIGV1LWNlbnRyYWwtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwH\nU2VhdHRsZTAgFw0yMTA1MjEyMjMzMjRaGA8yMTIxMDUyMTIzMzMyNFowgZkxCzAJ\nBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMw\nEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEyMDAGA1UEAwwpQW1hem9u\nIFJEUyBldS1jZW50cmFsLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATlBHiEM9LoEb1Hdnd5j2VpCDOU\n5nGuFoBD8ROUCkFLFh5mHrHfPXwBc63heW9WrP3qnDEm+UZEUvW7ROvtWCTPZdLz\nZ4XaqgAlSqeE2VfUyZOZzBSgUUJk7OlznXfkCMOjQjBAMA8GA1UdEwEB/wQFMAMB\nAf8wHQYDVR0OBBYEFDT/ThjQZl42Nv/4Z/7JYaPNMly2MA4GA1UdDwEB/wQEAwIB\nhjAKBggqhkjOPQQDAwNpADBmAjEAnZWmSgpEbmq+oiCa13l5aGmxSlfp9h12Orvw\nDq/W5cENJz891QD0ufOsic5oGq1JAjEAp5kSJj0MxJBTHQze1Aa9gG4sjHBxXn98\n4MP1VGsQuhfndNHQb4V0Au7OWnOeiobq\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/zCCAuegAwIBAgIRAMgnyikWz46xY6yRgiYwZ3swDQYJKoZIhvcNAQELBQAw\ngZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\nQW1hem9uIFJEUyBldS13ZXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyMDE2NDkxMloYDzIwNjEwNTIwMTc0OTEyWjCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIGV1LXdlc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCi8JYOc9cYSgZH\ngYPxLk6Xcc7HqzamvsnjYU98Dcb98y6iDqS46Ra2Ne02MITtU5MDL+qjxb8WGDZV\nRUA9ZS69tkTO3gldW8QdiSh3J6hVNJQW81F0M7ZWgV0gB3n76WCmfT4IWos0AXHM\n5v7M/M4tqVmCPViQnZb2kdVlM3/Xc9GInfSMCgNfwHPTXl+PXX+xCdNBePaP/A5C\n5S0oK3HiXaKGQAy3K7VnaQaYdiv32XUatlM4K2WS4AMKt+2cw3hTCjlmqKRHvYFQ\nveWCXAuc+U5PQDJ9SuxB1buFJZhT4VP3JagOuZbh5NWpIbOTxlAJOb5pGEDuJTKi\n1gQQQVEFAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNXm+N87\nOFxK9Af/bjSxDCiulGUzMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\nAQEAkqIbkgZ45spvrgRQ6n9VKzDLvNg+WciLtmVrqyohwwJbj4pYvWwnKQCkVc7c\nhUOSBmlSBa5REAPbH5o8bdt00FPRrD6BdXLXhaECKgjsHe1WW08nsequRKD8xVmc\n8bEX6sw/utBeBV3mB+3Zv7ejYAbDFM4vnRsWtO+XqgReOgrl+cwdA6SNQT9oW3e5\nrSQ+VaXgJtl9NhkiIysq9BeYigxqS/A13pHQp0COMwS8nz+kBPHhJTsajHCDc8F4\nHfLi6cgs9G0gaRhT8FCH66OdGSqn196sE7Y3bPFFFs/3U+vxvmQgoZC6jegQXAg5\nPrxd+VNXtNI/azitTysQPumH7A==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBTCCAu2gAwIBAgIRAO8bekN7rUReuNPG8pSTKtEwDQYJKoZIhvcNAQELBQAw\ngZoxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEzMDEGA1UEAwwq\nQW1hem9uIFJEUyBldS1jZW50cmFsLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYD\nVQQHDAdTZWF0dGxlMCAXDTIxMDUyMTIyMjM0N1oYDzIwNjEwNTIxMjMyMzQ3WjCB\nmjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\nbWF6b24gUkRTIGV1LWNlbnRyYWwtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNV\nBAcMB1NlYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCTTYds\nTray+Q9VA5j5jTh5TunHKFQzn68ZbOzdqaoi/Rq4ohfC0xdLrxCpfqn2TGDHN6Zi\n2qGK1tWJZEd1H0trhzd9d1CtGK+3cjabUmz/TjSW/qBar7e9MA67/iJ74Gc+Ww43\nA0xPNIWcL4aLrHaLm7sHgAO2UCKsrBUpxErOAACERScVYwPAfu79xeFcX7DmcX+e\nlIqY16pQAvK2RIzrekSYfLFxwFq2hnlgKHaVgZ3keKP+nmXcXmRSHQYUUr72oYNZ\nHcNYl2+gxCc9ccPEHM7xncVEKmb5cWEWvVoaysgQ+osi5f5aQdzgC2X2g2daKbyA\nXL/z5FM9GHpS5BJjAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\nFBDAiJ7Py9/A9etNa/ebOnx5l5MGMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0B\nAQsFAAOCAQEALMh/+81fFPdJV/RrJUeoUvFCGMp8iaANu97NpeJyKitNOv7RoeVP\nWjivS0KcCqZaDBs+p6IZ0sLI5ZH098LDzzytcfZg0PsGqUAb8a0MiU/LfgDCI9Ee\njsOiwaFB8k0tfUJK32NPcIoQYApTMT2e26lPzYORSkfuntme2PTHUnuC7ikiQrZk\nP+SZjWgRuMcp09JfRXyAYWIuix4Gy0eZ4rpRuaTK6mjAb1/LYoNK/iZ/gTeIqrNt\nl70OWRsWW8jEmSyNTIubGK/gGGyfuZGSyqoRX6OKHESkP6SSulbIZHyJ5VZkgtXo\n2XvyRyJ7w5pFyoofrL3Wv0UF8yt/GDszmg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF/zCCA+egAwIBAgIRAMDk/F+rrhdn42SfE+ghPC8wDQYJKoZIhvcNAQEMBQAw\ngZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\nQW1hem9uIFJEUyBldS13ZXN0LTIgUm9vdCBDQSBSU0E0MDk2IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyMTIyNTEyMloYDzIxMjEwNTIxMjM1MTIyWjCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIGV1LXdlc3QtMiBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2twMALVg9vRVu\nVNqsr6N8thmp3Dy8jEGTsm3GCQ+C5P2YcGlD/T/5icfWW84uF7Sx3ezcGlvsqFMf\nUkj9sQyqtz7qfFFugyy7pa/eH9f48kWFHLbQYm9GEgbYBIrWMp1cy3vyxuMCwQN4\nDCncqU+yNpy0CprQJEha3PzY+3yJOjDQtc3zr99lyECCFJTDUucxHzyQvX89eL74\nuh8la0lKH3v9wPpnEoftbrwmm5jHNFdzj7uXUHUJ41N7af7z7QUfghIRhlBDiKtx\n5lYZemPCXajTc3ryDKUZC/b+B6ViXZmAeMdmQoPE0jwyEp/uaUcdp+FlUQwCfsBk\nayPFEApTWgPiku2isjdeTVmEgL8bJTDUZ6FYFR7ZHcYAsDzcwHgIu3GGEMVRS3Uf\nILmioiyly9vcK4Sa01ondARmsi/I0s7pWpKflaekyv5boJKD/xqwz9lGejmJHelf\n8Od2TyqJScMpB7Q8c2ROxBwqwB72jMCEvYigB+Wnbb8RipliqNflIGx938FRCzKL\nUQUBmNAznR/yRRL0wHf9UAE/8v9a09uZABeiznzOFAl/frHpgdAbC00LkFlnwwgX\ng8YfEFlkp4fLx5B7LtoO6uVNFVimLxtwirpyKoj3G4M/kvSTux8bTw0heBCmWmKR\n57MS6k7ODzbv+Kpeht2hqVZCNFMxoQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/\nMB0GA1UdDgQWBBRuMnDhJjoj7DcKALj+HbxEqj3r6jAOBgNVHQ8BAf8EBAMCAYYw\nDQYJKoZIhvcNAQEMBQADggIBALSnXfx72C3ldhBP5kY4Mo2DDaGQ8FGpTOOiD95d\n0rf7I9LrsBGVqu/Nir+kqqP80PB70+Jy9fHFFigXwcPBX3MpKGxK8Cel7kVf8t1B\n4YD6A6bqlzP+OUL0uGWfZpdpDxwMDI2Flt4NEldHgXWPjvN1VblEKs0+kPnKowyg\njhRMgBbD/y+8yg0fIcjXUDTAw/+INcp21gWaMukKQr/8HswqC1yoqW9in2ijQkpK\n2RB9vcQ0/gXR0oJUbZQx0jn0OH8Agt7yfMAnJAdnHO4M3gjvlJLzIC5/4aGrRXZl\nJoZKfJ2fZRnrFMi0nhAYDeInoS+Rwx+QzaBk6fX5VPyCj8foZ0nmqvuYoydzD8W5\nmMlycgxFqS+DUmO+liWllQC4/MnVBlHGB1Cu3wTj5kgOvNs/k+FW3GXGzD3+rpv0\nQTLuwSbMr+MbEThxrSZRSXTCQzKfehyC+WZejgLb+8ylLJUA10e62o7H9PvCrwj+\nZDVmN7qj6amzvndCP98sZfX7CFZPLfcBd4wVIjHsFjSNEwWHOiFyLPPG7cdolGKA\nlOFvonvo4A1uRc13/zFeP0Xi5n5OZ2go8aOOeGYdI2vB2sgH9R2IASH/jHmr0gvY\n0dfBCcfXNgrS0toq0LX/y+5KkKOxh52vEYsJLdhqrveuZhQnsFEm/mFwjRXkyO7c\n2jpC\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nFEv9Bg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICsDCCAjagAwIBAgIRAMgApnfGYPpK/fD0dbN2U4YwCgYIKoZIzj0EAwMwgZcx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwnQW1h\nem9uIFJEUyBldS1zb3V0aC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdT\nZWF0dGxlMCAXDTIxMDUxOTE4MzgxMVoYDzIxMjEwNTE5MTkzODExWjCBlzELMAkG\nA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzAR\nBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6b24g\nUkRTIGV1LXNvdXRoLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1NlYXR0\nbGUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQfEWl6d4qSuIoECdZPp+39LaKsfsX7\nTHs3/RrtT0+h/jl3bjZ7Qc68k16x+HGcHbaayHfqD0LPdzH/kKtNSfQKqemdxDQh\nZ4pwkixJu8T1VpXZ5zzCvBXCl75UqgEFS92jQjBAMA8GA1UdEwEB/wQFMAMBAf8w\nHQYDVR0OBBYEFFPrSNtWS5JU+Tvi6ABV231XbjbEMA4GA1UdDwEB/wQEAwIBhjAK\nBggqhkjOPQQDAwNoADBlAjEA+a7hF1IrNkBd2N/l7IQYAQw8chnRZDzh4wiGsZsC\n6A83maaKFWUKIb3qZYXFSi02AjAbp3wxH3myAmF8WekDHhKcC2zDvyOiKLkg9Y6v\nZVmyMR043dscQbcsVoacOYv198c=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICtDCCAjqgAwIBAgIRAPhVkIsQ51JFhD2kjFK5uAkwCgYIKoZIzj0EAwMwgZkx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEyMDAGA1UEAwwpQW1h\nem9uIFJEUyBldS1jZW50cmFsLTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjIwNjA2MjEyOTE3WhgPMjEyMjA2MDYyMjI5MTdaMIGZMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMjAwBgNVBAMMKUFtYXpv\nbiBSRFMgZXUtY2VudHJhbC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdT\nZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEA5xnIEBtG5b2nmbj49UEwQza\nyX0844fXjccYzZ8xCDUe9dS2XOUi0aZlGblgSe/3lwjg8fMcKXLObGGQfgIx1+5h\nAIBjORis/dlyN5q/yH4U5sjS8tcR0GDGVHrsRUZCo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MB0GA1UdDgQWBBRK+lSGutXf4DkTjR3WNfv4+KeNFTAOBgNVHQ8BAf8EBAMC\nAYYwCgYIKoZIzj0EAwMDaAAwZQIxAJ4NxQ1Gerqr70ZrnUqc62Vl8NNqTzInamCG\nKce3FTsMWbS9qkgrjZkO9QqOcGIw/gIwSLrwUT+PKr9+H9eHyGvpq9/3AIYSnFkb\nCf3dyWPiLKoAtLFwjzB/CkJlsAS1c8dS\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF/jCCA+agAwIBAgIQGZH12Q7x41qIh9vDu9ikTjANBgkqhkiG9w0BAQwFADCB\nlzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\nbWF6b24gUkRTIGV1LXdlc3QtMyBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTI1MjIyMjMzWhgPMjEyMTA1MjUyMzIyMzNaMIGXMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\nbiBSRFMgZXUtd2VzdC0zIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMqE47sHXWzdpuqj\nJHb+6jM9tDbQLDFnYjDWpq4VpLPZhb7xPNh9gnYYTPKG4avG421EblAHqzy9D2pN\n1z90yKbIfUb/Sy2MhQbmZomsObhONEra06fJ0Dydyjswf1iYRp2kwpx5AgkVoNo7\n3dlws73zFjD7ImKvUx2C7B75bhnw2pJWkFnGcswl8fZt9B5Yt95sFOKEz2MSJE91\nkZlHtya19OUxZ/cSGci4MlOySzqzbGwUqGxEIDlY8I39VMwXaYQ8uXUN4G780VcL\nu46FeyRGxZGz2n3hMc805WAA1V5uir87vuirTvoSVREET97HVRGVVNJJ/FM6GXr1\nVKtptybbo81nefYJg9KBysxAa2Ao2x2ry/2ZxwhS6VZ6v1+90bpZA1BIYFEDXXn/\ndW07HSCFnYSlgPtSc+Muh15mdr94LspYeDqNIierK9i4tB6ep7llJAnq0BU91fM2\nJPeqyoTtc3m06QhLf68ccSxO4l8Hmq9kLSHO7UXgtdjfRVaffngopTNk8qK7bIb7\nLrgkqhiQw/PRCZjUdyXL153/fUcsj9nFNe25gM4vcFYwH6c5trd2tUl31NTi1MfG\nMgp3d2dqxQBIYANkEjtBDMy3SqQLIo9EymqmVP8xx2A/gCBgaxvMAsI6FSWRoC7+\nhqJ8XH4mFnXSHKtYMe6WPY+/XZgtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8w\nHQYDVR0OBBYEFIkXqTnllT/VJnI2NqipA4XV8rh1MA4GA1UdDwEB/wQEAwIBhjAN\nBgkqhkiG9w0BAQwFAAOCAgEAKjSle8eenGeHgT8pltWCw/HzWyQruVKhfYIBfKJd\nMhV4EnH5BK7LxBIvpXGsFUrb0ThzSw0fn0zoA9jBs3i/Sj6KyeZ9qUF6b8ycDXd+\nwHonmJiQ7nk7UuMefaYAfs06vosgl1rI7eBHC0itexIQmKh0aX+821l4GEgEoSMf\nloMFTLXv2w36fPHHCsZ67ODldgcZbKNnpCTX0YrCwEYO3Pz/L398btiRcWGrewrK\njdxAAyietra8DRno1Zl87685tfqc6HsL9v8rVw58clAo9XAQvT+fmSOFw/PogRZ7\nOMHUat3gu/uQ1M5S64nkLLFsKu7jzudBuoNmcJysPlzIbqJ7vYc82OUGe9ucF3wi\n3tbKQ983hdJiTExVRBLX/fYjPsGbG3JtPTv89eg2tjWHlPhCDMMxyRKl6isu2RTq\n6VT489Z2zQrC33MYF8ZqO1NKjtyMAMIZwxVu4cGLkVsqFmEV2ScDHa5RadDyD3Ok\nm+mqybhvEVm5tPgY6p0ILPMN3yvJsMSPSvuBXhO/X5ppNnpw9gnxpwbjQKNhkFaG\nM5pkADZ14uRguOLM4VthSwUSEAr5VQYCFZhEwK+UOyJAGiB/nJz6IxL5XBNUXmRM\nHl8Xvz4riq48LMQbjcVQj0XvH941yPh+P8xOi00SGaQRaWp55Vyr4YKGbV0mEDz1\nr1o=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF/zCCA+egAwIBAgIRAKwYju1QWxUZpn6D1gOtwgQwDQYJKoZIhvcNAQEMBQAw\ngZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\nQW1hem9uIFJEUyBldS13ZXN0LTEgUm9vdCBDQSBSU0E0MDk2IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyMDE2NTM1NFoYDzIxMjEwNTIwMTc1MzU0WjCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIGV1LXdlc3QtMSBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCKdBP1U4lqWWkc\nCb25/BKRTsvNVnISiKocva8GAzJyKfcGRa85gmgu41U+Hz6+39K+XkRfM0YS4BvQ\nF1XxWT0bNyypuvwCvmYShSTjN1TY0ltncDddahTajE/4MdSOZb/c98u0yt03cH+G\nhVwRyT50h0v/UEol50VfwcVAEZEgcQQYhf1IFUFlIvKpmDOqLuFakOnc7c9akK+i\nivST+JO1tgowbnNkn2iLlSSgUWgb1gjaOsNfysagv1RXdlyPw3EyfwkFifAQvF2P\nQ0ayYZfYS640cccv7efM1MSVyFHR9PrrDsF/zr2S2sGPbeHr7R/HwLl+S5J/l9N9\ny0rk6IHAWV4dEkOvgpnuJKURwA48iu1Hhi9e4moNS6eqoK2KmY3VFpuiyWcA73nH\nGSmyaH+YuMrF7Fnuu7GEHZL/o6+F5cL3mj2SJJhL7sz0ryf5Cs5R4yN9BIEj/f49\nwh84pM6nexoI0Q4wiSFCxWiBpjSmOK6h7z6+2utaB5p20XDZHhxAlmlx4vMuWtjh\nXckgRFxc+ZpVMU3cAHUpVEoO49e/+qKEpPzp8Xg4cToKw2+AfTk3cmyyXQfGwXMQ\nZUHNZ3w9ILMWihGCM2aGUsLcGDRennvNmnmin/SENsOQ8Ku0/a3teEzwV9cmmdYz\n5iYs1YtgPvKFobY6+T2RXXh+A5kprwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/\nMB0GA1UdDgQWBBSyUrsQVnKmA8z6/2Ech0rCvqpNmTAOBgNVHQ8BAf8EBAMCAYYw\nDQYJKoZIhvcNAQEMBQADggIBAFlj3IFmgiFz5lvTzFTRizhVofhTJsGr14Yfkuc7\nUrXPuXOwJomd4uot2d/VIeGJpfnuS84qGdmQyGewGTJ9inatHsGZgHl9NHNWRwKZ\nlTKTbBiq7aqgtUSFa06v202wpzU+1kadxJJePrbABxiXVfOmIW/a1a4hPNcT3syH\nFIEg1+CGsp71UNjBuwg3JTKWna0sLSKcxLOSOvX1fzxK5djzVpEsvQMB4PSAzXca\nvENgg2ErTwgTA+4s6rRtiBF9pAusN1QVuBahYP3ftrY6f3ycS4K65GnqscyfvKt5\nYgjtEKO3ZeeX8NpubMbzC+0Z6tVKfPFk/9TXuJtwvVeqow0YMrLLyRiYvK7EzJ97\nrrkxoKnHYQSZ+rH2tZ5SE392/rfk1PJL0cdHnkpDkUDO+8cKsFjjYKAQSNC52sKX\n74AVh6wMwxYwVZZJf2/2XxkjMWWhKNejsZhUkTISSmiLs+qPe3L67IM7GyKm9/m6\nR3r8x6NGjhTsKH64iYJg7AeKeax4b2e4hBb6GXFftyOs7unpEOIVkJJgM6gh3mwn\nR7v4gwFbLKADKt1vHuerSZMiTuNTGhSfCeDM53XI/mjZl2HeuCKP1mCDLlaO+gZR\nQ/G+E0sBKgEX4xTkAc3kgkuQGfExdGtnN2U2ehF80lBHB8+2y2E+xWWXih/ZyIcW\nwOx+\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\n89cEIGdbjsA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIQYjbPSg4+RNRD3zNxO1fuKDANBgkqhkiG9w0BAQsFADCB\nmDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChB\nbWF6b24gUkRTIGV1LW5vcnRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyNDIwNTkyMVoYDzIwNjEwNTI0MjE1OTIxWjCBmDEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChBbWF6\nb24gUkRTIGV1LW5vcnRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQHDAdT\nZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA179eQHxcV0YL\nXMkqEmhSBazHhnRVd8yICbMq82PitE3BZcnv1Z5Zs/oOgNmMkOKae4tCXO/41JCX\nwAgbs/eWWi+nnCfpQ/FqbLPg0h3dqzAgeszQyNl9IzTzX4Nd7JFRBVJXPIIKzlRf\n+GmFsAhi3rYgDgO27pz3ciahVSN+CuACIRYnA0K0s9lhYdddmrW/SYeWyoB7jPa2\nLmWpAs7bDOgS4LlP2H3eFepBPgNufRytSQUVA8f58lsE5w25vNiUSnrdlvDrIU5n\nQwzc7NIZCx4qJpRbSKWrUtbyJriWfAkGU7i0IoainHLn0eHp9bWkwb9D+C/tMk1X\nERZw2PDGkwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSFmR7s\ndAblusFN+xhf1ae0KUqhWTAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD\nggEBAHsXOpjPMyH9lDhPM61zYdja1ebcMVgfUvsDvt+w0xKMKPhBzYDMs/cFOi1N\nQ8LV79VNNfI2NuvFmGygcvTIR+4h0pqqZ+wjWl3Kk5jVxCrbHg3RBX02QLumKd/i\nkwGcEtTUvTssn3SM8bgM0/1BDXgImZPC567ciLvWDo0s/Fe9dJJC3E0G7d/4s09n\nOMdextcxFuWBZrBm/KK3QF0ByA8MG3//VXaGO9OIeeOJCpWn1G1PjT1UklYhkg61\nEbsTiZVA2DLd1BGzfU4o4M5mo68l0msse/ndR1nEY6IywwpgIFue7+rEleDh6b9d\nPYkG1rHVw2I0XDG4o17aOn5E94I=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIQC6W4HFghUkkgyQw14a6JljANBgkqhkiG9w0BAQsFADCB\nmDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChB\nbWF6b24gUkRTIGV1LXNvdXRoLTIgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIyMDUyMzE4MTYzMloYDzIwNjIwNTIzMTkxNjMyWjCBmDEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChBbWF6\nb24gUkRTIGV1LXNvdXRoLTIgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQHDAdT\nZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiM/t4FV2R9Nx\nUQG203UY83jInTa/6TMq0SPyg617FqYZxvz2kkx09x3dmxepUg9ttGMlPgjsRZM5\nLCFEi1FWk+hxHzt7vAdhHES5tdjwds3aIkgNEillmRDVrUsbrDwufLaa+MMDO2E1\nwQ/JYFXw16WBCCi2g1EtyQ2Xp+tZDX5IWOTnvhZpW8vVDptZ2AcJ5rMhfOYO3OsK\n5EF0GGA5ldzuezP+BkrBYGJ4wVKGxeaq9+5AT8iVZrypjwRkD7Y5CurywK3+aBwm\ns9Q5Nd8t45JCOUzYp92rFKsCriD86n/JnEvgDfdP6Hvtm0/DkwXK40Wz2q0Zrd0k\nmjP054NRPwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRR7yqd\nSfKcX2Q8GzhcVucReIpewTAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD\nggEBAEszBRDwXcZyNm07VcFwI1Im94oKwKccuKYeJEsizTBsVon8VpEiMwDs+yGu\n3p8kBhvkLwWybkD/vv6McH7T5b9jDX2DoOudqYnnaYeypsPH/00Vh3LvKagqzQza\norWLx+0tLo8xW4BtU+Wrn3JId8LvAhxyYXTn9bm+EwPcStp8xGLwu53OPD1RXYuy\nuu+3ps/2piP7GVfou7H6PRaqbFHNfiGg6Y+WA0HGHiJzn8uLmrRJ5YRdIOOG9/xi\nqTmAZloUNM7VNuurcMM2hWF494tQpsQ6ysg2qPjbBqzlGoOt3GfBTOZmqmwmqtam\nK7juWM/mdMQAJ3SMlE5wI8nVdx4=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjSgAwIBAgIRAL9SdzVPcpq7GOpvdGoM80IwCgYIKoZIzj0EAwMwgZYx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\nem9uIFJEUyBldS13ZXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTIwMTY1ODA3WhgPMjEyMTA1MjAxNzU4MDdaMIGWMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\nRFMgZXUtd2VzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEJWDgXebvwjR+Ce+hxKOLbnsfN5W5dOlP\nZn8kwWnD+SLkU81Eac/BDJsXGrMk6jFD1vg16PEkoSevsuYWlC8xR6FmT6F6pmeh\nfsMGOyJpfK4fyoEPhKeQoT23lFIc5Orjo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\nA1UdDgQWBBSVNAN1CHAz0eZ77qz2adeqjm31TzAOBgNVHQ8BAf8EBAMCAYYwCgYI\nKoZIzj0EAwMDaAAwZQIxAMlQeHbcjor49jqmcJ9gRLWdEWpXG8thIf6zfYQ/OEAg\nd7GDh4fR/OUk0VfjsBUN/gIwZB0bGdXvK38s6AAE/9IT051cz/wMe9GIrX1MnL1T\n1F5OqnXJdiwfZRRTHsRQ/L00\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\n1YfpdH2jp30=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/jCCAuagAwIBAgIQTDc+UgTRtYO7ZGTQ8UWKDDANBgkqhkiG9w0BAQsFADCB\nlzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\nbWF6b24gUkRTIGV1LXdlc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTIxMjI0NjI0WhgPMjA2MTA1MjEyMzQ2MjRaMIGXMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\nbiBSRFMgZXUtd2VzdC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM1oGtthQ1YiVIC2\ni4u4swMAGxAjc/BZp0yq0eP5ZQFaxnxs7zFAPabEWsrjeDzrRhdVO0h7zskrertP\ngblGhfD20JfjvCHdP1RUhy/nzG+T+hn6Takan/GIgs8grlBMRHMgBYHW7tklhjaH\n3F7LujhceAHhhgp6IOrpb6YTaTTaJbF3GTmkqxSJ3l1LtEoWz8Al/nL/Ftzxrtez\nVs6ebpvd7sw37sxmXBWX2OlvUrPCTmladw9OrllGXtCFw4YyLe3zozBlZ3cHzQ0q\nlINhpRcajTMfZrsiGCkQtoJT+AqVJPS2sHjqsEH8yiySW9Jbq4zyMbM1yqQ2vnnx\nMJgoYMcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUaQG88UnV\nJPTI+Pcti1P+q3H7pGYwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IB\nAQBAkgr75V0sEJimC6QRiTVWEuj2Khy7unjSfudbM6zumhXEU2/sUaVLiYy6cA/x\n3v0laDle6T07x9g64j5YastE/4jbzrGgIINFlY0JnaYmR3KZEjgi1s1fkRRf3llL\nPJm9u4Q1mbwAMQK/ZjLuuRcL3uRIHJek18nRqT5h43GB26qXyvJqeYYpYfIjL9+/\nYiZAbSRRZG+Li23cmPWrbA1CJY121SB+WybCbysbOXzhD3Sl2KSZRwSw4p2HrFtV\n1Prk0dOBtZxCG9luf87ultuDZpfS0w6oNBAMXocgswk24ylcADkkFxBWW+7BETn1\nEpK+t1Lm37mU4sxtuha00XAi\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIQcY44/8NUvBwr6LlHfRy7KjANBgkqhkiG9w0BAQsFADCB\nmDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChB\nbWF6b24gUkRTIGV1LXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUxOTE4MjcxOFoYDzIwNjEwNTE5MTkyNzE4WjCBmDEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChBbWF6\nb24gUkRTIGV1LXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQHDAdT\nZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0UaBeC+Usalu\nEtXnV7+PnH+gi7/71tI/jkKVGKuhD2JDVvqLVoqbMHRh3+wGMvqKCjbHPcC2XMWv\n566fpAj4UZ9CLB5fVzss+QVNTl+FH2XhEzigopp+872ajsNzcZxrMkifxGb4i0U+\nt0Zi+UrbL5tsfP2JonKR1crOrbS6/DlzHBjIiJazGOQcMsJjNuTOItLbMohLpraA\n/nApa3kOvI7Ufool1/34MG0+wL3UUA4YkZ6oBJVxjZvvs6tI7Lzz/SnhK2widGdc\nsnbLqBpHNIZQSorVoiwcFaRBGYX/uzYkiw44Yfa4cK2V/B5zgu1Fbr0gbI2am4eh\nyVYyg4jPawIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS9gM1m\nIIjyh9O5H/7Vj0R/akI7UzAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD\nggEBAF0Sm9HC2AUyedBVnwgkVXMibnYChOzz7T+0Y+fOLXYAEXex2s8oqGeZdGYX\nJHkjBn7JXu7LM+TpTbPbFFDoc1sgMguD/ls+8XsqAl1CssW+amryIL+jfcfbgQ+P\nICwEUD9hGdjBgJ5WcuS+qqxHsEIlFNci3HxcxfBa9VsWs5TjI7Vsl4meL5lf7ZyL\nwDV7dHRuU+cImqG1MIvPRIlvPnT7EghrCYi2VCPhP2pM/UvShuwVnkz4MJ29ebIk\nWR9kpblFxFdE92D5UUvMCjC2kmtgzNiErvTcwIvOO9YCbBHzRB1fFiWrXUHhJWq9\nIkaxR5icb/IpAV0A1lYZEWMVsfQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nrM2p0kk=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\nADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\nb24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\nMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\nb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\nca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\n9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\nIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\nVOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\n93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\njgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\nA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\nU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\nN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\no/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\n5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\nrqXRfboQnoZsG4q5WTP468SQvvG5\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF\nADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\nb24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL\nMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\nb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK\ngXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ\nW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg\n1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K\n8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r\n2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me\nz/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR\n8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj\nmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz\n7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6\n+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI\n0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB\nAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm\nUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2\nLIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY\n+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS\nk5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl\n7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm\nbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl\nurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+\nfUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63\nn749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE\n76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H\n9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT\n4PsJYGw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5\nMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\nUm9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\nA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\nQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl\nui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j\nQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr\nttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr\nBqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM\nYyRIHN8wfdVoOw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5\nMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\nUm9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\nA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\nQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi\n9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk\nM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB\n/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB\nMAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw\nCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW\n1KyLa2tJElMzrdfkviT8tQp21KW8EA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx\nEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\nHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs\nZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\nMDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD\nVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy\nZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy\ndmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p\nOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2\n8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K\nTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe\nhRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk\n6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw\nDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q\nAdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI\nbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB\nve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z\nqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\niEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn\n0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN\nsSi6\n-----END CERTIFICATE-----"
  },
  {
    "path": "stubs/runtime-with-vendor-download.php",
    "content": "<?php\n\nini_set('display_errors', '1');\n\nerror_reporting(E_ALL);\n\nif (! file_exists('/tmp/opcache')) {\n    mkdir('/tmp/opcache');\n}\n\n$appRoot = $_ENV['LAMBDA_TASK_ROOT'];\n\n/*\n|--------------------------------------------------------------------------\n| Download The Vendor Directory\n|--------------------------------------------------------------------------\n|\n| For applications which are loading their vendor directory on container\n| boot, we'll need to download it and extract it into place. This can\n| allow larger applications to be uploaded to Vapor without issues.\n|\n*/\n\nif (! file_exists('/tmp/vendor')) {\n    exec(sprintf('/opt/awscli/aws s3 cp s3://%s/%s-vendor.zip /tmp/vendor.zip',\n        $_ENV['VAPOR_ARTIFACT_BUCKET_NAME'],\n        $_ENV['VAPOR_ARTIFACT_NAME']\n    ));\n\n    exec('unzip /tmp/vendor.zip -d /tmp/vendor');\n\n    unlink('/tmp/vendor.zip');\n}\n\n/*\n|--------------------------------------------------------------------------\n| Bootstrap The Runtime\n|--------------------------------------------------------------------------\n|\n| If the application is being served by the console layer, we will require in the\n| console runtime. Otherwise, we will use the FPM runtime. Vapor will setup an\n| environment variable for the console layer that we will use to check this.\n|\n*/\n\nrequire '/tmp/vendor/autoload.php';\n\nif (isset($_ENV['APP_RUNNING_IN_CONSOLE']) &&\n    $_ENV['APP_RUNNING_IN_CONSOLE'] === 'true') {\n    return require __DIR__.'/cliRuntime.php';\n} else {\n    return require __DIR__.'/fpmRuntime.php';\n}\n"
  },
  {
    "path": "stubs/runtime.php",
    "content": "<?php\n\nini_set('display_errors', '1');\n\nerror_reporting(E_ALL);\n\nif (! file_exists('/tmp/opcache')) {\n    mkdir('/tmp/opcache');\n}\n\n$appRoot = $_ENV['LAMBDA_TASK_ROOT'];\n\nrequire $appRoot.'/vendor/autoload.php';\n\n/*\n|--------------------------------------------------------------------------\n| Bootstrap The Runtime\n|--------------------------------------------------------------------------\n|\n| If the application is being served by the console layer, we will require in the\n| console runtime. Otherwise, we will use the FPM runtime. Vapor will setup an\n| environment variable for the console layer that we will use to check this.\n|\n*/\n\nif (isset($_ENV['APP_RUNNING_IN_CONSOLE']) && $_ENV['APP_RUNNING_IN_CONSOLE'] === 'true') {\n    return require __DIR__.'/cliRuntime.php';\n}\n\nif (isset($_ENV['APP_RUNNING_IN_OCTANE']) && $_ENV['APP_RUNNING_IN_OCTANE'] === 'true') {\n    return require __DIR__.'/octaneRuntime.php';\n}\n\nreturn require __DIR__.'/fpmRuntime.php';\n"
  },
  {
    "path": "tests/Feature/ApiGatewayOctaneHandlerTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Feature;\n\nif (! interface_exists(\\Laravel\\Octane\\Contracts\\Client::class)) {\n    return;\n}\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Route;\nuse Laravel\\Octane\\Events\\RequestReceived;\nuse Laravel\\Octane\\Events\\RequestTerminated;\nuse Laravel\\Octane\\OctaneServiceProvider;\nuse Laravel\\Vapor\\Runtime\\Handlers\\OctaneHandler;\nuse Laravel\\Vapor\\Runtime\\Octane\\Octane;\nuse Laravel\\Vapor\\Tests\\TestCase;\nuse Mockery;\nuse RuntimeException;\nuse Symfony\\Component\\HttpFoundation\\StreamedResponse;\n\nclass ApiGatewayOctaneHandlerTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        if (! class_exists(\\Laravel\\Octane\\Octane::class)) {\n            $this->markTestSkipped('Requires Laravel Octane.');\n        }\n\n        parent::setUp();\n\n        $_ENV['APP_VANITY_URL'] = 'https://127.0.0.1';\n        $_ENV['LAMBDA_TASK_ROOT'] = __DIR__.'/../Fixtures';\n\n        Octane::boot(app()->basePath());\n\n        Octane::worker()->application()->register(OctaneServiceProvider::class);\n    }\n\n    protected function tearDown(): void\n    {\n        Mockery::close();\n\n        unset($_ENV['APP_VANITY_URL']);\n        unset($_ENV['LAMBDA_TASK_ROOT']);\n        unset($_ENV['VAPOR_MAINTENANCE_MODE_SECRET']);\n\n        Octane::terminate();\n\n        parent::tearDown();\n    }\n\n    public function test_response_body()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n        ]);\n\n        static::assertEquals('Hello World', $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_invalid_uri()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/////foo',\n        ]);\n\n        static::assertEquals('Hello World', $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_response_file()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return response()->file(__DIR__.'/../Fixtures/asset.js', [\n                'Content-Type' => 'text/javascript; charset=UTF-8',\n            ]);\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n        ]);\n\n        static::assertEquals('text/javascript; charset=UTF-8', $response->toApiGatewayFormat()['headers']['Content-Type']);\n        static::assertEquals(\"console.log();\\n\", $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_response_download()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return response()->download(__DIR__.'/../Fixtures/asset.js');\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n        ]);\n\n        static::assertEquals('attachment; filename=asset.js', $response->toApiGatewayFormat()['headers']['Content-Disposition']);\n        static::assertEquals(\"console.log();\\n\", $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_response_fires_events()\n    {\n        Event::fake([RequestReceived::class, RequestTerminated::class]);\n\n        $handler = new OctaneHandler();\n\n        Route::get('/', function () {\n            return response('Hello World')->withHeaders([\n                'Foo' => 'Bar',\n            ]);\n        });\n\n        $handler->handle([\n            'httpMethod' => 'GET',\n        ]);\n\n        Event::assertDispatched(RequestReceived::class);\n        Event::assertDispatched(RequestTerminated::class);\n    }\n\n    public function test_response_headers()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function () {\n            return response('Hello World')->withHeaders([\n                'Foo' => 'Bar',\n            ]);\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n        ]);\n\n        static::assertArrayHasKey('Foo', $response->toApiGatewayFormat()['headers']);\n        static::assertEquals('Bar', $response->toApiGatewayFormat()['headers']['Foo']);\n    }\n\n    public function test_response_status()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function () {\n            throw new RuntimeException('Something wrong happened.');\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n        ]);\n\n        static::assertEquals(500, $response->toApiGatewayFormat()['statusCode']);\n    }\n\n    public function test_each_request_have_its_own_app()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/bind', function () {\n            app()->bind('counter', function () {\n                return 1;\n            });\n\n            return app('counter');\n        });\n\n        Route::get('/bound', function () {\n            return app()->bound('counter') ? 'bound' : 'not bound';\n        });\n\n        $bindResponse = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/bind',\n        ]);\n\n        $boundResponse = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/bound',\n        ]);\n\n        static::assertEquals('1', $bindResponse->toApiGatewayFormat()['body']);\n        static::assertEquals('not bound', $boundResponse->toApiGatewayFormat()['body']);\n    }\n\n    public function test_response_cookies()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function () {\n            return response('Hello World')->cookie('cookie-key', 'cookie-value', 10);\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n        ]);\n\n        $setCookie = $response->toApiGatewayFormat()['headers']['set-cookie'];\n\n        static::assertStringStartsWith('cookie-key=cookie-value;', $setCookie);\n    }\n\n    public function test_robots_header_is_set()\n    {\n        $handler = new OctaneHandler();\n\n        $_ENV['APP_VANITY_URL'] = 'https://127.0.0.1';\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n        ]);\n\n        $robotsTag = $response->toApiGatewayFormat()['headers']['X-Robots-Tag'];\n\n        static::assertEquals('noindex, nofollow', $robotsTag);\n    }\n\n    public function test_maintenance_mode()\n    {\n        $handler = new OctaneHandler();\n\n        $_ENV['VAPOR_MAINTENANCE_MODE'] = 'true';\n        $_ENV['APP_VANITY_URL'] = 'production.com';\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'headers' => [\n                'Accept' => 'application/json',\n            ],\n        ]);\n\n        static::assertEquals('application/json', $response->toApiGatewayFormat()['headers']['Content-Type']);\n        static::assertEquals(['message' => 'We are currently down for maintenance.'], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_body()\n    {\n        $handler = new OctaneHandler();\n\n        Route::put('/', function (Request $request) {\n            return $request->all();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'POST',\n            'path' => '/',\n            'headers' => [\n                'Content-Type' => 'application/json',\n            ],\n            'body' => <<<'EOF'\n{\"_method\":\"PUT\",\"name\":\"nuno\",\"email\":\"nuno@laravel.com\"}\nEOF\n        ]);\n\n        static::assertEquals([\n            '_method' => 'PUT',\n            'name' => 'nuno',\n            'email' => 'nuno@laravel.com',\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_form_url_encoded_without_inline_input_method()\n    {\n        $handler = new OctaneHandler();\n\n        Route::put('/', function (Request $request) {\n            return $request->all();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'PUT',\n            'path' => '/',\n            'headers' => [\n                'Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8',\n            ],\n            'body' => <<<'EOF'\nname=nuno&email=nuno@laravel.com\nEOF\n        ]);\n\n        static::assertEquals([\n            'name' => 'nuno',\n            'email' => 'nuno@laravel.com',\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_cookies()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->cookies->all();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'headers' => [\n                'cookie' => 'XSRF-TOKEN=token_value',\n            ],\n        ]);\n\n        static::assertEquals(\n            ['XSRF-TOKEN' => 'token_value'],\n            json_decode($response->toApiGatewayFormat()['body'], true)\n        );\n    }\n\n    public function test_request_ignores_invalid_cookies()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->cookies->all();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'headers' => [\n                'cookie' => 'cookieKey1; cookieKey2=cookieValue2',\n            ],\n        ]);\n\n        static::assertEquals(\n            ['cookieKey2' => 'cookieValue2'],\n            json_decode($response->toApiGatewayFormat()['body'], true)\n        );\n    }\n\n    public function test_request_file_uploads()\n    {\n        $handler = new OctaneHandler();\n\n        Route::put('/', function (Request $request) {\n            return array_merge($request->all(), [\n                'filename' => $request->file('file')->getClientOriginalName(),\n                'file' => $request->file('file')->getContent(),\n            ]);\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'POST',\n            'path' => '/',\n            'headers' => [\n                'Content-Type' => 'multipart/form-data; boundary=---------------------------317050813134112680482597024243',\n            ],\n            'body' => <<<'EOF'\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"_method\"\n\nPUT\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"name\"\n\nnuno\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"email\"\n\nnuno@laravel.com\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"file\"; filename=\"my_uploaded.txt\"\nContent-Type: text/plain\n\nfoo\n-----------------------------317050813134112680482597024243--\nEOF\n        ]);\n\n        static::assertEquals([\n            '_method' => 'PUT',\n            'name' => 'nuno',\n            'email' => 'nuno@laravel.com',\n            'filename' => 'my_uploaded.txt',\n            'file' => 'foo',\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_file_uploads_without_inline_input_method()\n    {\n        $handler = new OctaneHandler();\n\n        Route::put('/', function (Request $request) {\n            return array_merge($request->all(), [\n                'filename' => $request->file('file')->getClientOriginalName(),\n                'file' => $request->file('file')->getContent(),\n            ]);\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'PUT',\n            'path' => '/',\n            'headers' => [\n                'Content-Type' => 'multipart/form-data; boundary=---------------------------317050813134112680482597024243',\n            ],\n            'body' => <<<'EOF'\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"name\"\n\nnuno\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"email\"\n\nnuno@laravel.com\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"file\"; filename=\"my_uploaded.txt\"\nContent-Type: text/plain\n\nfoo\n-----------------------------317050813134112680482597024243--\nEOF\n        ]);\n\n        static::assertEquals([\n            'name' => 'nuno',\n            'email' => 'nuno@laravel.com',\n            'filename' => 'my_uploaded.txt',\n            'file' => 'foo',\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_query_string()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->getQueryString();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'multiValueQueryStringParameters' => [\n                'param1' => ['value1'],\n                'param2' => ['value1', 'value2'],\n            ],\n            'headers' => [\n                'cookie' => 'XSRF-TOKEN=token_value',\n            ],\n        ]);\n\n        static::assertEquals('param1=value1&param2[0]=value1&param2[1]=value2', urldecode($response->toApiGatewayFormat()['body']));\n    }\n\n    public function test_request_query_params()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->query();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'multiValueQueryStringParameters' => [\n                'param1' => ['value1'],\n                'param2' => ['value1', 'value2'],\n            ],\n            'headers' => [\n                'cookie' => 'XSRF-TOKEN=token_value',\n            ],\n        ]);\n\n        static::assertEquals([\n            'param1' => 'value1',\n            'param2' => ['value1', 'value2'],\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_headers()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->headers->all();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'headers' => [\n                'X-Xsrf-Token' => 'my-token',\n            ],\n        ]);\n\n        $body = $response->toApiGatewayFormat()['body'];\n\n        static::assertEquals(['my-token'], json_decode($body, true)['x-xsrf-token']);\n    }\n\n    public function test_request_multi_headers()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->headers->all();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'multiValueHeaders' => [\n                'X-Xsrf-Token' => ['my-token'],\n                'X-Multi-Header' => ['value1', 'value2'],\n            ],\n        ]);\n\n        $body = $response->toApiGatewayFormat()['body'];\n\n        static::assertEquals(['my-token'], json_decode($body, true)['x-xsrf-token']);\n        static::assertEquals(['value2'], json_decode($body, true)['x-multi-header']);\n    }\n\n    public function test_maintenance_mode_with_valid_bypass_cookie()\n    {\n        $octane = new class() extends Octane\n        {\n            public static function hasValidBypassCookie($request, $secret)\n            {\n                return true;\n            }\n        };\n\n        $handler = new class() extends OctaneHandler\n        {\n            public function request($event)\n            {\n                return parent::request($event);\n            }\n\n            public function response($response)\n            {\n                return parent::response($response);\n            }\n        };\n\n        $_ENV['VAPOR_MAINTENANCE_MODE'] = 'true';\n        $_ENV['APP_VANITY_URL'] = 'production.com';\n        $_ENV['VAPOR_MAINTENANCE_MODE_SECRET'] = 'my-secret';\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->response($octane::handle($handler->request([\n            'httpMethod' => 'GET',\n            'path' => '/',\n        ])));\n\n        static::assertEquals('Hello World', $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_maintenance_mode_with_invalid_bypass_cookie()\n    {\n        $handler = new OctaneHandler();\n\n        $_ENV['VAPOR_MAINTENANCE_MODE'] = 'true';\n        $_ENV['APP_VANITY_URL'] = 'production.com';\n        $_ENV['VAPOR_MAINTENANCE_MODE_SECRET'] = 'my-secret';\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'headers' => [\n                'Accept' => 'application/json',\n            ],\n        ]);\n\n        static::assertEquals('application/json', $response->toApiGatewayFormat()['headers']['Content-Type']);\n        static::assertEquals(['message' => 'We are currently down for maintenance.'], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_streamed_responses()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function () {\n            return new StreamedResponse(function () {\n                echo 'Hello World';\n            }, 200, ['mime-type' => 'image/png']);\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'headers' => [],\n        ]);\n\n        static::assertEquals('image/png', $response->toApiGatewayFormat()['headers']['Mime-Type']);\n        static::assertEquals('Hello World', $response->toApiGatewayFormat()['body']);\n    }\n}\n"
  },
  {
    "path": "tests/Feature/Commands/OctaneStatusCommandTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Feature\\Commands;\n\nif (! interface_exists(\\Laravel\\Octane\\Contracts\\Client::class)) {\n    return;\n}\n\nuse Laravel\\Vapor\\Tests\\TestCase;\n\nclass OctaneStatusCommandTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        $_ENV['VAPOR_SSM_PATH'] = 'foo';\n\n        parent::setUp();\n    }\n\n    public function test_when_octane_is_not_running()\n    {\n        $this->artisan('octane:status')\n            ->assertSuccessful()\n            ->expectsOutput('Octane server is not running.');\n    }\n\n    public function test_when_octane_is_running()\n    {\n        $_ENV['OCTANE_DATABASE_SESSION_TTL'] = 'false';\n\n        $this->artisan('octane:status')\n            ->assertSuccessful()\n            ->expectsOutput('Octane server is running.');\n    }\n\n    protected function tearDown(): void\n    {\n        unset($_ENV['OCTANE_DATABASE_SESSION_TTL']);\n        unset($_ENV['VAPOR_SSM_PATH']);\n\n        parent::tearDown();\n    }\n}\n"
  },
  {
    "path": "tests/Feature/EnsureOnNakedDomainTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Feature;\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Laravel\\Vapor\\Runtime\\Http\\Middleware\\EnsureOnNakedDomain;\nuse Laravel\\Vapor\\VaporServiceProvider;\nuse Orchestra\\Testbench\\TestCase;\nuse PHPUnit\\Framework\\Attributes\\DataProvider;\n\nclass EnsureOnNakedDomainTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        parent::setUp();\n\n        $_ENV['APP_VANITY_URL'] = 'https://something.vapor-farm.com';\n\n        Route::get('/', function () {\n            return 'Hello World';\n        })->middleware(EnsureOnNakedDomain::class);\n    }\n\n    protected function getPackageProviders($app): array\n    {\n        return [\n            VaporServiceProvider::class,\n        ];\n    }\n\n    #[DataProvider('useCases')]\n    public function test_redirects($useCase)\n    {\n        config()->set('vapor.redirect_to_root', $useCase['redirect_to_root']);\n        config()->set('app.url', $useCase['app_url']);\n\n        $response = $this->get($useCase['request_url']);\n\n        $response->assertStatus($useCase['response_status']);\n\n        if ($useCase['response_status'] == 301) {\n            $response->assertRedirect($useCase['redirected_to']);\n        }\n    }\n\n    public static function useCases()\n    {\n        return [\n            [[\n                'app_url' => 'https://domain.com',\n                'request_url' => 'https://domain.com',\n                'redirect_to_root' => true,\n                'response_status' => 200,\n            ]],\n            [[\n                'app_url' => 'https://domain.net.io',\n                'request_url' => 'https://domain.net.io',\n                'redirect_to_root' => true,\n                'response_status' => 200,\n            ]],\n            [[\n                'app_url' => 'https://domain.com',\n                'request_url' => 'https://www.domain.com',\n                'redirect_to_root' => true,\n                'response_status' => 301,\n                'redirected_to' => 'https://domain.com',\n            ]],\n            [[\n                'app_url' => 'https://domain.net.io',\n                'request_url' => 'https://www.domain.net.io',\n                'redirect_to_root' => true,\n                'response_status' => 301,\n                'redirected_to' => 'https://domain.net.io',\n            ]],\n            [[\n                'app_url' => 'https://domain.com',\n                'request_url' => 'https://sub.domain.com',\n                'redirect_to_root' => true,\n                'response_status' => 200,\n            ]],\n            [[\n                'app_url' => 'https://domain.net.io',\n                'request_url' => 'https://sub.domain.net.io',\n                'redirect_to_root' => true,\n                'response_status' => 200,\n            ]],\n\n            // redirect_to_root => false\n            [[\n                'app_url' => 'https://domain.com',\n                'request_url' => 'https://www.domain.com',\n                'redirect_to_root' => false,\n                'response_status' => 200,\n            ]],\n            [[\n                'app_url' => 'https://domain.net.io',\n                'request_url' => 'https://www.domain.net.io',\n                'redirect_to_root' => false,\n                'response_status' => 200,\n            ]],\n            [[\n                'app_url' => 'https://domain.com',\n                'request_url' => 'https://domain.com',\n                'redirect_to_root' => false,\n                'response_status' => 301,\n                'redirected_to' => 'https://www.domain.com',\n            ]],\n            [[\n                'app_url' => 'https://domain.net.io',\n                'request_url' => 'https://domain.net.io',\n                'redirect_to_root' => false,\n                'response_status' => 301,\n                'redirected_to' => 'https://www.domain.net.io',\n            ]],\n            [[\n                'app_url' => 'https://domain.com',\n                'request_url' => 'https://sub.domain.com',\n                'redirect_to_root' => false,\n                'response_status' => 200,\n            ]],\n            [[\n                'app_url' => 'https://domain.net.io',\n                'request_url' => 'https://sub.domain.net.io',\n                'redirect_to_root' => false,\n                'response_status' => 200,\n            ]],\n        ];\n    }\n}\n"
  },
  {
    "path": "tests/Feature/LambdaProxyOctaneHandlerTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Feature;\n\nif (! interface_exists(\\Laravel\\Octane\\Contracts\\Client::class)) {\n    return;\n}\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Route;\nuse Laravel\\Octane\\Events\\RequestReceived;\nuse Laravel\\Octane\\Events\\RequestTerminated;\nuse Laravel\\Octane\\OctaneServiceProvider;\nuse Laravel\\Vapor\\Runtime\\Handlers\\OctaneHandler;\nuse Laravel\\Vapor\\Runtime\\Octane\\Octane;\nuse Laravel\\Vapor\\Tests\\TestCase;\nuse Mockery;\nuse RuntimeException;\n\nclass LambdaProxyOctaneHandlerTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        if (! class_exists(\\Laravel\\Octane\\Octane::class)) {\n            $this->markTestSkipped('Requires Laravel Octane.');\n        }\n\n        parent::setUp();\n\n        $_ENV['APP_VANITY_URL'] = 'https://127.0.0.1';\n        $_ENV['LAMBDA_TASK_ROOT'] = __DIR__.'/../Fixtures';\n\n        Octane::boot(app()->basePath());\n\n        Octane::worker()->application()->register(OctaneServiceProvider::class);\n    }\n\n    protected function tearDown(): void\n    {\n        Mockery::close();\n\n        unset($_ENV['APP_VANITY_URL']);\n        unset($_ENV['LAMBDA_TASK_ROOT']);\n        unset($_ENV['VAPOR_MAINTENANCE_MODE_SECRET']);\n\n        Octane::terminate();\n\n        parent::tearDown();\n    }\n\n    public function test_response_body()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                ],\n            ],\n        ]);\n\n        static::assertEquals('Hello World', $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_invalid_uri()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/////foo',\n                ],\n            ],\n        ]);\n\n        static::assertEquals('Hello World', $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_response_file()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return response()->file(__DIR__.'/../Fixtures/asset.js', [\n                'Content-Type' => 'text/javascript; charset=UTF-8',\n            ]);\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/',\n                ],\n            ],\n        ]);\n\n        static::assertEquals('text/javascript; charset=UTF-8', $response->toApiGatewayFormat()['headers']['Content-Type']);\n        static::assertEquals(\"console.log();\\n\", $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_response_download()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return response()->download(__DIR__.'/../Fixtures/asset.js');\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                ],\n            ],\n        ]);\n\n        static::assertEquals('attachment; filename=asset.js', $response->toApiGatewayFormat()['headers']['Content-Disposition']);\n        static::assertEquals(\"console.log();\\n\", $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_response_fires_events()\n    {\n        Event::fake([RequestReceived::class, RequestTerminated::class]);\n\n        $handler = new OctaneHandler();\n\n        Route::get('/', function () {\n            return response('Hello World')->withHeaders([\n                'Foo' => 'Bar',\n            ]);\n        });\n\n        $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                ],\n            ],\n        ]);\n\n        Event::assertDispatched(RequestReceived::class);\n        Event::assertDispatched(RequestTerminated::class);\n    }\n\n    public function test_response_headers()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function () {\n            return response('Hello World')->withHeaders([\n                'Foo' => 'Bar',\n            ]);\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                ],\n            ],\n        ]);\n\n        static::assertArrayHasKey('Foo', $response->toApiGatewayFormat()['headers']);\n        static::assertEquals('Bar', $response->toApiGatewayFormat()['headers']['Foo']);\n    }\n\n    public function test_response_status()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function () {\n            throw new RuntimeException('Something wrong happened.');\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                ],\n            ],\n        ]);\n\n        static::assertEquals(500, $response->toApiGatewayFormat()['statusCode']);\n    }\n\n    public function test_each_request_have_its_own_app()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/bind', function () {\n            app()->bind('counter', function () {\n                return 1;\n            });\n\n            return app('counter');\n        });\n\n        Route::get('/bound', function () {\n            return app()->bound('counter') ? 'bound' : 'not bound';\n        });\n\n        $bindResponse = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/bind',\n                ],\n            ],\n        ]);\n\n        $boundResponse = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/bound',\n                ],\n            ],\n        ]);\n\n        static::assertEquals('1', $bindResponse->toApiGatewayFormat()['body']);\n        static::assertEquals('not bound', $boundResponse->toApiGatewayFormat()['body']);\n    }\n\n    public function test_response_cookies()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function () {\n            return response('Hello World')->cookie('cookie-key', 'cookie-value', 10);\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/',\n                ],\n            ],\n        ]);\n\n        $setCookie = $response->toApiGatewayFormat()['headers']['set-cookie'];\n\n        static::assertStringStartsWith('cookie-key=cookie-value;', $setCookie);\n    }\n\n    public function test_robots_header_is_set()\n    {\n        $handler = new OctaneHandler();\n\n        $_ENV['APP_VANITY_URL'] = 'https://127.0.0.1';\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/',\n                ],\n            ],\n        ]);\n\n        $robotsTag = $response->toApiGatewayFormat()['headers']['X-Robots-Tag'];\n\n        static::assertEquals('noindex, nofollow', $robotsTag);\n    }\n\n    public function test_maintenance_mode()\n    {\n        $handler = new OctaneHandler();\n\n        $_ENV['VAPOR_MAINTENANCE_MODE'] = 'true';\n        $_ENV['APP_VANITY_URL'] = 'production.com';\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/',\n                ],\n            ],\n            'headers' => [\n                'Accept' => 'application/json',\n            ],\n        ]);\n\n        static::assertEquals('application/json', $response->toApiGatewayFormat()['headers']['Content-Type']);\n        static::assertEquals(['message' => 'We are currently down for maintenance.'], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_body()\n    {\n        $handler = new OctaneHandler();\n\n        Route::put('/', function (Request $request) {\n            return $request->all();\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'POST',\n                    'path' => '/',\n                ],\n            ],\n            'headers' => [\n                'Content-Type' => 'application/json',\n            ],\n            'body' => <<<'EOF'\n{\"_method\":\"PUT\",\"name\":\"nuno\",\"email\":\"nuno@laravel.com\"}\nEOF\n        ]);\n\n        static::assertEquals([\n            '_method' => 'PUT',\n            'name' => 'nuno',\n            'email' => 'nuno@laravel.com',\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_form_url_encoded_without_inline_input_method()\n    {\n        $handler = new OctaneHandler();\n\n        Route::put('/', function (Request $request) {\n            return $request->all();\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'PUT',\n                    'path' => '/',\n                ],\n            ],\n            'headers' => [\n                'Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8',\n            ],\n            'body' => <<<'EOF'\nname=nuno&email=nuno@laravel.com\nEOF\n        ]);\n\n        static::assertEquals([\n            'name' => 'nuno',\n            'email' => 'nuno@laravel.com',\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_cookies()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->cookies->all();\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/',\n                ],\n            ],\n            'cookies' => [\n                'XSRF-TOKEN=token_value',\n            ],\n        ]);\n\n        static::assertEquals(\n            ['XSRF-TOKEN' => 'token_value'],\n            json_decode($response->toApiGatewayFormat()['body'], true)\n        );\n    }\n\n    public function test_request_ignores_invalid_cookies()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->cookies->all();\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/',\n                ],\n            ],\n            'cookies' => [\n                'cookieKey1',\n                'cookieKey2=cookieValue2',\n            ],\n        ]);\n\n        static::assertEquals(\n            ['cookieKey2' => 'cookieValue2'],\n            json_decode($response->toApiGatewayFormat()['body'], true)\n        );\n    }\n\n    public function test_request_file_uploads()\n    {\n        $handler = new OctaneHandler();\n\n        Route::put('/', function (Request $request) {\n            return array_merge($request->all(), [\n                'filename' => $request->file('file')->getClientOriginalName(),\n                'file' => $request->file('file')->getContent(),\n            ]);\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'POST',\n                    'path' => '/',\n                ],\n            ],\n            'headers' => [\n                'Content-Type' => 'multipart/form-data; boundary=---------------------------317050813134112680482597024243',\n            ],\n            'body' => <<<'EOF'\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"_method\"\n\nPUT\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"name\"\n\nnuno\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"email\"\n\nnuno@laravel.com\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"file\"; filename=\"my_uploaded.txt\"\nContent-Type: text/plain\n\nfoo\n-----------------------------317050813134112680482597024243--\nEOF\n        ]);\n\n        static::assertEquals([\n            '_method' => 'PUT',\n            'name' => 'nuno',\n            'email' => 'nuno@laravel.com',\n            'filename' => 'my_uploaded.txt',\n            'file' => 'foo',\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_file_uploads_without_inline_input_method()\n    {\n        $handler = new OctaneHandler();\n\n        Route::put('/', function (Request $request) {\n            return array_merge($request->all(), [\n                'filename' => $request->file('file')->getClientOriginalName(),\n                'file' => $request->file('file')->getContent(),\n            ]);\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'PUT',\n                    'path' => '/',\n                ],\n            ],\n            'headers' => [\n                'Content-Type' => 'multipart/form-data; boundary=---------------------------317050813134112680482597024243',\n            ],\n            'body' => <<<'EOF'\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"name\"\n\nnuno\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"email\"\n\nnuno@laravel.com\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"file\"; filename=\"my_uploaded.txt\"\nContent-Type: text/plain\n\nfoo\n-----------------------------317050813134112680482597024243--\nEOF\n        ]);\n\n        static::assertEquals([\n            'name' => 'nuno',\n            'email' => 'nuno@laravel.com',\n            'filename' => 'my_uploaded.txt',\n            'file' => 'foo',\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_query_string()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->getQueryString();\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/',\n                ],\n            ],\n            'queryStringParameters' => [\n                'param1' => 'value1',\n                'param2' => 'value1,value2',\n            ],\n            'headers' => [\n                'cookie' => 'XSRF-TOKEN=token_value',\n            ],\n        ]);\n\n        static::assertEquals('param1=value1&param2[0]=value1&param2[1]=value2', urldecode($response->toApiGatewayFormat()['body']));\n    }\n\n    public function test_request_query_params()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->query();\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/',\n                ],\n            ],\n            'queryStringParameters' => [\n                'param1' => 'value1',\n                'param2' => 'value1,value2',\n            ],\n            'headers' => [\n                'cookie' => 'XSRF-TOKEN=token_value',\n            ],\n        ]);\n\n        static::assertEquals([\n            'param1' => 'value1',\n            'param2' => ['value1', 'value2'],\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_headers()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->headers->all();\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/',\n                ],\n            ],\n            'path' => '/',\n            'headers' => [\n                'X-Xsrf-Token' => 'my-token',\n            ],\n        ]);\n\n        $body = $response->toApiGatewayFormat()['body'];\n\n        static::assertEquals(['my-token'], json_decode($body, true)['x-xsrf-token']);\n    }\n\n    public function test_request_multi_headers()\n    {\n        $handler = new OctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->headers->all();\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/',\n                ],\n            ],\n            'headers' => [\n                'X-Xsrf-Token' => 'my-token',\n                'X-Multi-Header' => 'value1,value2',\n            ],\n        ]);\n\n        $body = $response->toApiGatewayFormat()['body'];\n\n        static::assertEquals(['my-token'], json_decode($body, true)['x-xsrf-token']);\n        static::assertEquals(['value1,value2'], json_decode($body, true)['x-multi-header']);\n    }\n\n    public function test_maintenance_mode_with_valid_bypass_cookie()\n    {\n        $octane = new class() extends Octane\n        {\n            public static function hasValidBypassCookie($request, $secret)\n            {\n                return true;\n            }\n        };\n\n        $handler = new class() extends OctaneHandler\n        {\n            public function request($event)\n            {\n                return parent::request($event);\n            }\n\n            public function response($response)\n            {\n                return parent::response($response);\n            }\n        };\n\n        $_ENV['VAPOR_MAINTENANCE_MODE'] = 'true';\n        $_ENV['APP_VANITY_URL'] = 'production.com';\n        $_ENV['VAPOR_MAINTENANCE_MODE_SECRET'] = 'my-secret';\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->response($octane::handle($handler->request([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/',\n                ],\n            ],\n        ])));\n\n        static::assertEquals('Hello World', $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_maintenance_mode_with_invalid_bypass_cookie()\n    {\n        $handler = new OctaneHandler();\n\n        $_ENV['VAPOR_MAINTENANCE_MODE'] = 'true';\n        $_ENV['APP_VANITY_URL'] = 'production.com';\n        $_ENV['VAPOR_MAINTENANCE_MODE_SECRET'] = 'my-secret';\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'path' => '/',\n                ],\n            ],\n            'headers' => [\n                'Accept' => 'application/json',\n            ],\n        ]);\n\n        static::assertEquals('application/json', $response->toApiGatewayFormat()['headers']['Content-Type']);\n        static::assertEquals(['message' => 'We are currently down for maintenance.'], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n}\n"
  },
  {
    "path": "tests/Feature/LoadBalancedOctaneHandlerTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Feature;\n\nif (! interface_exists(\\Laravel\\Octane\\Contracts\\Client::class)) {\n    return;\n}\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Route;\nuse Laravel\\Octane\\Events\\RequestReceived;\nuse Laravel\\Octane\\Events\\RequestTerminated;\nuse Laravel\\Octane\\OctaneServiceProvider;\nuse Laravel\\Vapor\\Runtime\\Handlers\\LoadBalancedOctaneHandler;\nuse Laravel\\Vapor\\Runtime\\Octane\\Octane;\nuse Laravel\\Vapor\\Tests\\TestCase;\nuse Mockery;\nuse RuntimeException;\nuse Symfony\\Component\\HttpFoundation\\StreamedResponse;\n\nclass LoadBalancedOctaneHandlerTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        if (! class_exists(\\Laravel\\Octane\\Octane::class)) {\n            $this->markTestSkipped('Requires Laravel Octane.');\n        }\n\n        parent::setUp();\n\n        $_ENV['APP_VANITY_URL'] = 'https://127.0.0.1';\n        $_ENV['LAMBDA_TASK_ROOT'] = __DIR__.'/../Fixtures';\n\n        Octane::boot(app()->basePath());\n\n        Octane::worker()->application()->register(OctaneServiceProvider::class);\n    }\n\n    protected function tearDown(): void\n    {\n        Mockery::close();\n\n        unset($_ENV['APP_VANITY_URL']);\n        unset($_ENV['LAMBDA_TASK_ROOT']);\n        unset($_ENV['VAPOR_MAINTENANCE_MODE_SECRET']);\n\n        Octane::terminate();\n\n        parent::tearDown();\n    }\n\n    public function test_response_body()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n        ]);\n\n        static::assertEquals('Hello World', $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_invalid_uri()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/////foo',\n        ]);\n\n        static::assertEquals('Hello World', $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_response_fires_events()\n    {\n        Event::fake([RequestReceived::class, RequestTerminated::class]);\n\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function () {\n            return response('Hello World')->withHeaders([\n                'Foo' => 'Bar',\n            ]);\n        });\n\n        $handler->handle([\n            'httpMethod' => 'GET',\n        ]);\n\n        Event::assertDispatched(RequestReceived::class);\n        Event::assertDispatched(RequestTerminated::class);\n    }\n\n    public function test_response_file()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return response()->file(__DIR__.'/../Fixtures/asset.js', [\n                'Content-Type' => 'text/javascript; charset=UTF-8',\n            ]);\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n        ]);\n\n        static::assertEquals(['text/javascript; charset=UTF-8'], $response->toApiGatewayFormat()['multiValueHeaders']['Content-Type']);\n        static::assertEquals(\"console.log();\\n\", $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_response_download()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return response()->download(__DIR__.'/../Fixtures/asset.js');\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n        ]);\n\n        static::assertEquals(['attachment; filename=asset.js'], $response->toApiGatewayFormat()['multiValueHeaders']['Content-Disposition']);\n        static::assertEquals(\"console.log();\\n\", $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_response_headers()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function () {\n            return response('Hello World')->withHeaders([\n                'Foo' => 'Bar',\n            ]);\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n        ]);\n\n        static::assertArrayHasKey('Foo', $response->toApiGatewayFormat()['multiValueHeaders']);\n        static::assertEquals(['Bar'], $response->toApiGatewayFormat()['multiValueHeaders']['Foo']);\n    }\n\n    public function test_response_status()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function () {\n            throw new RuntimeException('Something wrong happened.');\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n        ]);\n\n        static::assertEquals(500, $response->toApiGatewayFormat()['statusCode']);\n    }\n\n    public function test_each_response_have_its_own_app()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/bind', function () {\n            app()->bind('counter', function () {\n                return 1;\n            });\n\n            return app('counter');\n        });\n\n        Route::get('/bound', function () {\n            return app()->bound('counter') ? 'bound' : 'not bound';\n        });\n\n        $bindResponse = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => 'bind',\n        ]);\n\n        $boundResponse = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => 'bound',\n        ]);\n\n        static::assertEquals('1', $bindResponse->toApiGatewayFormat()['body']);\n        static::assertEquals('not bound', $boundResponse->toApiGatewayFormat()['body']);\n    }\n\n    public function test_response_cookies()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function () {\n            return response('Hello World')->cookie('cookie-key', 'cookie-value', 10);\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n        ]);\n\n        $setCookie = $response->toApiGatewayFormat()['multiValueHeaders']['Set-Cookie'];\n\n        static::assertStringStartsWith('cookie-key=cookie-value;', $setCookie[0]);\n    }\n\n    public function test_robots_header_is_set()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n        ]);\n\n        $robotsTag = $response->toApiGatewayFormat()['multiValueHeaders']['X-Robots-Tag'];\n\n        static::assertEquals(['noindex, nofollow'], $robotsTag);\n    }\n\n    public function test_maintenance_mode()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        $_ENV['VAPOR_MAINTENANCE_MODE'] = 'true';\n        $_ENV['APP_VANITY_URL'] = 'production.com';\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'headers' => [\n                'Accept' => 'application/json',\n            ],\n        ]);\n\n        static::assertEquals(['application/json'], $response->toApiGatewayFormat()['multiValueHeaders']['Content-Type']);\n        static::assertEquals(['message' => 'We are currently down for maintenance.'], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_body()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::put('/', function (Request $request) {\n            return $request->all();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'POST',\n            'path' => '/',\n            'headers' => [\n                'Content-Type' => 'application/json',\n            ],\n            'body' => <<<'EOF'\n{\"_method\":\"PUT\",\"name\":\"nuno\",\"email\":\"nuno@laravel.com\"}\nEOF\n        ]);\n\n        static::assertEquals([\n            '_method' => 'PUT',\n            'name' => 'nuno',\n            'email' => 'nuno@laravel.com',\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_form_url_encoded_without_inline_input_method()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::put('/', function (Request $request) {\n            return $request->all();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'PUT',\n            'path' => '/',\n            'headers' => [\n                'Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8',\n            ],\n            'body' => <<<'EOF'\nname=nuno&email=nuno@laravel.com\nEOF\n        ]);\n\n        static::assertEquals([\n            'name' => 'nuno',\n            'email' => 'nuno@laravel.com',\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_file_uploads()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::put('/', function (Request $request) {\n            return array_merge($request->all(), [\n                'filename' => $request->file('file')->getClientOriginalName(),\n                'file' => $request->file('file')->getContent(),\n            ]);\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'POST',\n            'path' => '/',\n            'headers' => [\n                'Content-Type' => 'multipart/form-data; boundary=---------------------------317050813134112680482597024243',\n            ],\n            'body' => <<<'EOF'\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"_method\"\n\nPUT\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"name\"\n\nnuno\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"email\"\n\nnuno@laravel.com\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"file\"; filename=\"my_uploaded.txt\"\nContent-Type: text/plain\n\nfoo\n-----------------------------317050813134112680482597024243--\nEOF\n        ]);\n\n        static::assertEquals([\n            '_method' => 'PUT',\n            'name' => 'nuno',\n            'email' => 'nuno@laravel.com',\n            'filename' => 'my_uploaded.txt',\n            'file' => 'foo',\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_file_uploads_without_inline_input_method()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::put('/', function (Request $request) {\n            return array_merge($request->all(), [\n                'filename' => $request->file('file')->getClientOriginalName(),\n                'file' => $request->file('file')->getContent(),\n            ]);\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'PUT',\n            'path' => '/',\n            'headers' => [\n                'Content-Type' => 'multipart/form-data; boundary=---------------------------317050813134112680482597024243',\n            ],\n            'body' => <<<'EOF'\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"name\"\n\nnuno\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"email\"\n\nnuno@laravel.com\n-----------------------------317050813134112680482597024243\nContent-Disposition: form-data; name=\"file\"; filename=\"my_uploaded.txt\"\nContent-Type: text/plain\n\nfoo\n-----------------------------317050813134112680482597024243--\nEOF\n        ]);\n\n        static::assertEquals([\n            'name' => 'nuno',\n            'email' => 'nuno@laravel.com',\n            'filename' => 'my_uploaded.txt',\n            'file' => 'foo',\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_cookies()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->cookies->all();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'headers' => [\n                'cookie' => 'XSRF-TOKEN=token_value',\n            ],\n        ]);\n\n        static::assertEquals(\n            ['XSRF-TOKEN' => 'token_value'],\n            json_decode($response->toApiGatewayFormat()['body'], true)\n        );\n    }\n\n    public function test_request_ignores_invalid_cookies()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->cookies->all();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'headers' => [\n                'cookie' => 'cookieKey1; cookieKey2=cookieValue2',\n            ],\n        ]);\n\n        static::assertEquals(\n            ['cookieKey2' => 'cookieValue2'],\n            json_decode($response->toApiGatewayFormat()['body'], true)\n        );\n    }\n\n    public function test_request_query_string()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->getQueryString();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'multiValueQueryStringParameters' => [\n                'param1' => ['value1'],\n                'param2' => ['value1', 'value2'],\n            ],\n            'headers' => [\n                'cookie' => 'XSRF-TOKEN=token_value',\n            ],\n        ]);\n\n        static::assertEquals('param1=value1&param2[0]=value1&param2[1]=value2', urldecode($response->toApiGatewayFormat()['body']));\n    }\n\n    public function test_request_query_params()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->query();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'multiValueQueryStringParameters' => [\n                'param1' => ['value1'],\n                'param2' => ['value1', 'value2'],\n            ],\n            'headers' => [\n                'cookie' => 'XSRF-TOKEN=token_value',\n            ],\n        ]);\n\n        static::assertEquals([\n            'param1' => 'value1',\n            'param2' => ['value1', 'value2'],\n        ], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_request_headers()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->headers->all();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'headers' => [\n                'X-Xsrf-Token' => 'my-token',\n            ],\n        ]);\n\n        $body = $response->toApiGatewayFormat()['body'];\n\n        static::assertEquals(['my-token'], json_decode($body, true)['x-xsrf-token']);\n    }\n\n    public function test_request_multi_headers()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function (Request $request) {\n            return $request->headers->all();\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'multiValueHeaders' => [\n                'X-Xsrf-Token' => ['my-token'],\n                'X-Multi-Header' => ['value1', 'value2'],\n            ],\n        ]);\n\n        $body = $response->toApiGatewayFormat()['body'];\n\n        static::assertEquals(['my-token'], json_decode($body, true)['x-xsrf-token']);\n        static::assertEquals(['value2'], json_decode($body, true)['x-multi-header']);\n    }\n\n    public function test_maintenance_mode_with_valid_bypass_cookie()\n    {\n        $octane = new class() extends Octane\n        {\n            public static function hasValidBypassCookie($request, $secret)\n            {\n                return true;\n            }\n        };\n\n        $handler = new class() extends LoadBalancedOctaneHandler\n        {\n            public function request($event)\n            {\n                return parent::request($event);\n            }\n\n            public function response($response)\n            {\n                return parent::response($response);\n            }\n        };\n\n        $_ENV['VAPOR_MAINTENANCE_MODE'] = 'true';\n        $_ENV['APP_VANITY_URL'] = 'production.com';\n        $_ENV['VAPOR_MAINTENANCE_MODE_SECRET'] = 'my-secret';\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->response($octane::handle($handler->request([\n            'httpMethod' => 'GET',\n            'path' => '/',\n        ])));\n\n        static::assertEquals('Hello World', $response->toApiGatewayFormat()['body']);\n    }\n\n    public function test_maintenance_mode_with_invalid_bypass_cookie()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        $_ENV['VAPOR_MAINTENANCE_MODE'] = 'true';\n        $_ENV['APP_VANITY_URL'] = 'production.com';\n        $_ENV['VAPOR_MAINTENANCE_MODE_SECRET'] = 'my-secret';\n\n        Route::get('/', function () {\n            return 'Hello World';\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'headers' => [\n                'Accept' => 'application/json',\n            ],\n        ]);\n\n        static::assertEquals(['application/json'], $response->toApiGatewayFormat()['multiValueHeaders']['Content-Type']);\n        static::assertEquals(['message' => 'We are currently down for maintenance.'], json_decode($response->toApiGatewayFormat()['body'], true));\n    }\n\n    public function test_streamed_responses()\n    {\n        $handler = new LoadBalancedOctaneHandler();\n\n        Route::get('/', function () {\n            return new StreamedResponse(function () {\n                echo 'Hello World';\n            }, 200, ['mime-type' => 'image/png']);\n        });\n\n        $response = $handler->handle([\n            'httpMethod' => 'GET',\n            'path' => '/',\n            'headers' => [\n                'Accept' => 'application/json',\n            ],\n        ]);\n\n        static::assertEquals(['image/png'], $response->toApiGatewayFormat()['multiValueHeaders']['Mime-Type']);\n        static::assertEquals('Hello World', $response->toApiGatewayFormat()['body']);\n    }\n}\n"
  },
  {
    "path": "tests/Feature/OctaneManageDatabaseSessionsTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Feature;\n\nuse Laravel\\Vapor\\Tests\\TestCase;\nuse Mockery;\nuse PDO;\nuse PDOException;\n\nclass OctaneManageDatabaseSessionsTest extends TestCase\n{\n    public function test_it_does_not_throw_when_pdo_connection_has_gone_away()\n    {\n        $stalePdo = Mockery::mock(PDO::class);\n        $stalePdo->shouldReceive('exec')\n            ->andThrow(new PDOException(\n                'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away'\n            ));\n\n        try {\n            collect([$stalePdo])\n                ->filter(fn ($pdo) => $pdo instanceof PDO)\n                ->each(function ($pdo) {\n                    try {\n                        $pdo->exec(sprintf('SET SESSION wait_timeout=%s', 10));\n                    } catch (\\Throwable $e) {\n                        // Connection already gone away, safe to ignore...\n                    }\n                });\n        } catch (\\Throwable $e) {\n            $this->fail('Expected no exception, but caught: '.$e->getMessage());\n        }\n\n        $this->assertTrue(true);\n    }\n\n    public function test_it_proves_bug_exists_without_fix()\n    {\n        $stalePdo = Mockery::mock(PDO::class);\n        $stalePdo->shouldReceive('exec')\n            ->andThrow(new PDOException(\n                'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away'\n            ));\n\n        $this->expectException(PDOException::class);\n\n        // This is the ORIGINAL broken code - proves the bug\n        collect([$stalePdo])\n            ->filter(fn ($pdo) => $pdo instanceof PDO)\n            ->each->exec(sprintf('SET SESSION wait_timeout=%s', 10));\n    }\n\n    public function test_it_still_sets_wait_timeout_on_live_connections()\n    {\n        $livePdo = Mockery::mock(PDO::class);\n        $livePdo->shouldReceive('exec')\n            ->once()\n            ->with('SET SESSION wait_timeout=10')\n            ->andReturn(true);\n\n        collect([$livePdo])\n            ->filter(fn ($pdo) => $pdo instanceof PDO)\n            ->each(function ($pdo) {\n                try {\n                    $pdo->exec(sprintf('SET SESSION wait_timeout=%s', 10));\n                } catch (\\Throwable $e) {\n                    //\n                }\n            });\n\n        $this->addToAssertionCount(\n            Mockery::getContainer()->mockery_getExpectationCount()\n        );\n    }\n\n    public function test_it_handles_mixed_live_and_stale_connections()\n    {\n        // Simulates Aurora writer alive + reader dead\n        $livePdo = Mockery::mock(PDO::class);\n        $livePdo->shouldReceive('exec')->once()->andReturn(true);\n\n        $stalePdo = Mockery::mock(PDO::class);\n        $stalePdo->shouldReceive('exec')\n            ->andThrow(new PDOException(\n                'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away'\n            ));\n\n        try {\n            collect([$livePdo, $stalePdo])\n                ->filter(fn ($pdo) => $pdo instanceof PDO)\n                ->each(function ($pdo) {\n                    try {\n                        $pdo->exec(sprintf('SET SESSION wait_timeout=%s', 10));\n                    } catch (\\Throwable $e) {\n                        //\n                    }\n                });\n        } catch (\\Throwable $e) {\n            $this->fail('Expected no exception, but caught: '.$e->getMessage());\n        }\n\n        $this->assertTrue(true);\n    }\n}\n"
  },
  {
    "path": "tests/Feature/OctaneTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Feature;\n\nif (! interface_exists(\\Laravel\\Octane\\Contracts\\Client::class)) {\n    return;\n}\n\nuse Exception;\nuse Illuminate\\Contracts\\Debug\\ExceptionHandler;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Event;\nuse Laravel\\Octane\\Events\\WorkerErrorOccurred;\nuse Laravel\\Octane\\OctaneServiceProvider;\nuse Laravel\\Octane\\RequestContext;\nuse Laravel\\Vapor\\Runtime\\Octane\\Octane;\nuse Laravel\\Vapor\\Tests\\TestCase;\nuse Mockery;\n\nclass OctaneTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        if (! class_exists(\\Laravel\\Octane\\Octane::class)) {\n            $this->markTestSkipped('Requires Laravel Octane.');\n        }\n\n        parent::setUp();\n\n        Octane::boot(app()->basePath());\n\n        Octane::worker()->application()->register(OctaneServiceProvider::class);\n    }\n\n    protected function tearDown(): void\n    {\n        Mockery::close();\n\n        Octane::terminate();\n\n        parent::tearDown();\n    }\n\n    public function test_on_error()\n    {\n        Event::fake([WorkerErrorOccurred::class]);\n\n        $worker = Octane::worker();\n\n        $reflection = new \\ReflectionClass($worker);\n        $method = tap($reflection->getMethod('handleWorkerError'))->setAccessible(true);\n\n        $exception = new Exception('Something wrong happened');\n\n        $exceptionHandler = Mockery::mock(ExceptionHandler::class);\n        $exceptionHandler->shouldReceive('report')->with($exception);\n\n        $app = Mockery::mock($worker->application());\n        $app->shouldReceive('make')->with(ExceptionHandler::class)->andReturn($exceptionHandler);\n\n        $method->invoke(\n            $worker,\n            $exception,\n            $app,\n            new Request(),\n            new RequestContext(),\n            false\n        );\n\n        Event::assertDispatched(WorkerErrorOccurred::class);\n    }\n\n    public function test_server_software()\n    {\n        self::assertSame('vapor', $_ENV['SERVER_SOFTWARE']);\n        self::assertSame('vapor', $_SERVER['SERVER_SOFTWARE']);\n    }\n}\n"
  },
  {
    "path": "tests/Feature/RedirectStaticAssetsTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Feature;\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Laravel\\Vapor\\Runtime\\Http\\Middleware\\RedirectStaticAssets;\nuse Laravel\\Vapor\\VaporServiceProvider;\nuse Orchestra\\Testbench\\TestCase;\n\nclass RedirectStaticAssetsTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        parent::setUp();\n\n        $_ENV['ASSET_URL'] = 'https://asset-url.com';\n\n        Route::get('/favicon.ico', function () {\n            return 'My own favicon.';\n        })->middleware(RedirectStaticAssets::class);\n    }\n\n    protected function getPackageProviders($app): array\n    {\n        return [\n            VaporServiceProvider::class,\n        ];\n    }\n\n    public function test_redirects_to_favicon_ico()\n    {\n        $response = $this->get('/favicon.ico');\n        $response->assertStatus(302)->assertRedirect('https://asset-url.com/favicon.ico');\n\n        config()->set('vapor.redirect_favicon', false);\n\n        $response = $this->get('/favicon.ico');\n        $response->assertStatus(200)->assertSee('My own favicon.');\n    }\n}\n"
  },
  {
    "path": "tests/Feature/SignedStorageUrlEndpointTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Feature;\n\nuse Illuminate\\Support\\Facades\\Config;\nuse Illuminate\\Support\\Facades\\Gate;\nuse Laravel\\Vapor\\VaporServiceProvider;\nuse Orchestra\\Testbench\\TestCase;\n\nclass SignedStorageUrlEndpointTest extends TestCase\n{\n    protected function getPackageProviders($app): array\n    {\n        return [\n            VaporServiceProvider::class,\n        ];\n    }\n\n    public function test_signed_url_preserves_its_components(): void\n    {\n        Config::set([\n            'filesystems.disks.s3.bucket' => $_ENV['AWS_BUCKET'] = 'storage',\n            'filesystems.disks.s3.key' => $_ENV['AWS_ACCESS_KEY_ID'] = 'sail',\n            'filesystems.disks.s3.region' => $_ENV['AWS_DEFAULT_REGION'] = 'us-east-1',\n            'filesystems.disks.s3.secret' => $_ENV['AWS_SECRET_ACCESS_KEY'] = 'password',\n            'filesystems.disks.s3.url' => $_ENV['AWS_URL'] = 'http://minio:9000',\n            'filesystems.disks.s3.use_path_style_endpoint' => true,\n        ]);\n\n        Gate::define('uploadFiles', static function ($user = null, $bucket = null): bool {\n            return true;\n        });\n\n        $response = $this->json('POST', '/vapor/signed-storage-url')\n            ->assertStatus(201);\n\n        $components = (object) [\n            'actual' => parse_url($response->json('url')),\n            'expected' => parse_url($_ENV['AWS_URL'].'/'.$_ENV['AWS_BUCKET']),\n        ];\n\n        $this->assertEquals($components->expected['scheme'], $components->actual['scheme']);\n        $this->assertEquals($components->expected['host'], $components->actual['host']);\n        $this->assertEquals($components->expected['port'], $components->actual['port']);\n        $this->assertStringStartsWith($components->expected['path'], $components->actual['path']);\n    }\n\n    public function test_signed_url_expires_after(): void\n    {\n        Config::set([\n            'filesystems.disks.s3.bucket' => $_ENV['AWS_BUCKET'] = 'storage',\n            'filesystems.disks.s3.key' => $_ENV['AWS_ACCESS_KEY_ID'] = 'sail',\n            'filesystems.disks.s3.region' => $_ENV['AWS_DEFAULT_REGION'] = 'us-east-1',\n            'filesystems.disks.s3.secret' => $_ENV['AWS_SECRET_ACCESS_KEY'] = 'password',\n            'filesystems.disks.s3.url' => $_ENV['AWS_URL'] = 'http://minio:9000',\n            'filesystems.disks.s3.use_path_style_endpoint' => true,\n        ]);\n\n        Gate::define('uploadFiles', static function ($user = null, $bucket = null): bool {\n            return true;\n        });\n\n        $response = $this->json('POST', '/vapor/signed-storage-url');\n        parse_str($response->json()['url'], $queryParams);\n        $this->assertEquals(300, $queryParams['X-Amz-Expires']);\n\n        config()->set('vapor.signed_storage_url_expires_after', 6);\n        $response = $this->json('POST', '/vapor/signed-storage-url');\n        parse_str($response->json()['url'], $queryParams);\n        $this->assertEquals(360, $queryParams['X-Amz-Expires']);\n    }\n}\n"
  },
  {
    "path": "tests/Feature/VaporJobTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Feature;\n\nuse Aws\\Result;\nuse Aws\\Sqs\\SqsClient;\nuse Illuminate\\Cache\\ArrayStore;\nuse Laravel\\Vapor\\Queue\\JobAttempts;\nuse Laravel\\Vapor\\Queue\\VaporJob;\nuse Laravel\\Vapor\\Tests\\TestCase;\nuse Laravel\\Vapor\\Tests\\Unit\\FakeJob;\nuse Laravel\\Vapor\\VaporServiceProvider;\nuse Mockery;\n\nclass VaporJobTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        parent::setUp();\n\n        $this->app->singleton('cache.store', ArrayStore::class);\n    }\n\n    protected function getPackageProviders($app): array\n    {\n        return [\n            VaporServiceProvider::class,\n        ];\n    }\n\n    public function test_job_release_attempts_without_cache()\n    {\n        unset($_ENV['VAPOR_CACHE_JOB_ATTEMPTS']);\n\n        $sqs = Mockery::mock(SqsClient::class);\n\n        $sqs->shouldReceive('deleteMessage')->once()->with([\n            'QueueUrl' => 'test-vapor-queue-url',\n            'ReceiptHandle' => 'test-receipt-handle',\n        ]);\n\n        $sqs->shouldReceive('sendMessage')->once()->with([\n            'QueueUrl' => 'test-vapor-queue-url',\n            'MessageBody' => json_encode(['attempts' => 2]),\n            'DelaySeconds' => 0,\n        ])->andReturn(new Result([\n            'MessageId' => 'my-released-job-id',\n        ]));\n\n        $job = new VaporJob($this->app, $sqs, [\n            'ReceiptHandle' => 'test-receipt-handle',\n            'Body' => json_encode(['attempts' => 1]),\n            'MessageId' => 'my-job-id',\n        ], 'sqs', 'test-vapor-queue-url');\n\n        $job->release();\n\n        $this->assertSame(0, resolve(JobAttempts::class)->get('my-job-id'));\n        $this->assertSame(0, resolve(JobAttempts::class)->get('my-released-job-id'));\n    }\n\n    public function test_job_release_attempts_with_cache()\n    {\n        $_ENV['VAPOR_CACHE_JOB_ATTEMPTS'] = 'true';\n\n        $sqs = Mockery::mock(SqsClient::class);\n\n        $sqs->shouldReceive('deleteMessage')->once()->with([\n            'QueueUrl' => 'test-vapor-queue-url',\n            'ReceiptHandle' => 'test-receipt-handle',\n        ]);\n\n        $sqs->shouldReceive('sendMessage')->once()->with([\n            'QueueUrl' => 'test-vapor-queue-url',\n            'MessageBody' => json_encode(['attempts' => 2]),\n            'DelaySeconds' => 0,\n        ])->andReturn(new Result([\n            'MessageId' => 'my-released-job-id',\n        ]));\n\n        $job = new VaporJob($this->app, $sqs, [\n            'ReceiptHandle' => 'test-receipt-handle',\n            'Body' => json_encode(['attempts' => 1]),\n            'MessageId' => 'my-job-id',\n        ], 'sqs', 'test-vapor-queue-url');\n\n        // Equivalent to ['attempts' => 1]\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n\n        $job->release();\n\n        $this->assertSame(0, resolve(JobAttempts::class)->get('my-job-id'));\n        $this->assertSame(2, resolve(JobAttempts::class)->get('my-released-job-id'));\n    }\n\n    public function test_job_attempts_without_cache()\n    {\n        unset($_ENV['VAPOR_CACHE_JOB_ATTEMPTS']);\n\n        $sqs = Mockery::mock(SqsClient::class);\n\n        $job = new VaporJob($this->app, $sqs, [\n            'Body' => json_encode(['attempts' => 1]),\n            'MessageId' => 'my-job-id',\n        ], 'sqs', 'test-vapor-queue-url');\n\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n\n        $this->assertSame(2, $job->attempts());\n        $this->assertSame(0, resolve(JobAttempts::class)->get($job));\n    }\n\n    public function test_job_attempts_with_cache()\n    {\n        $_ENV['VAPOR_CACHE_JOB_ATTEMPTS'] = 'true';\n\n        $sqs = Mockery::mock(SqsClient::class);\n\n        $job = new VaporJob($this->app, $sqs, [\n            'Body' => json_encode(['attempts' => 1]),\n            'MessageId' => 'my-job-id',\n        ], 'sqs', 'test-vapor-queue-url');\n\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n\n        $this->assertSame(4, $job->attempts());\n        $this->assertSame(4, resolve(JobAttempts::class)->get($job));\n    }\n\n    public function test_job_attempts_priority()\n    {\n        $_ENV['VAPOR_CACHE_JOB_ATTEMPTS'] = 'true';\n\n        $sqs = Mockery::mock(SqsClient::class);\n\n        $job = new VaporJob($this->app, $sqs, [\n            'Body' => json_encode(['attempts' => 2]),\n            'MessageId' => 'my-job-id',\n        ], 'sqs', 'test-vapor-queue-url');\n\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n\n        $this->assertSame(3, $job->attempts());\n\n        $job = new VaporJob($this->app, $sqs, [\n            'Body' => json_encode(['attempts' => 0]),\n            'MessageId' => 'my-other-job-id',\n        ], 'sqs', 'test-vapor-queue-url');\n\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n\n        $this->assertSame(2, $job->attempts());\n    }\n\n    public function test_job_attempts_when_its_missing_from_payload()\n    {\n        unset($_ENV['VAPOR_CACHE_JOB_ATTEMPTS']);\n\n        $sqs = Mockery::mock(SqsClient::class);\n\n        $job = new VaporJob($this->app, $sqs, [\n            'Body' => json_encode([]),\n            'MessageId' => 'my-job-id',\n        ], 'sqs', 'test-vapor-queue-url');\n\n        $this->assertSame(1, $job->attempts());\n    }\n\n    public function test_job_attempts_on_delete()\n    {\n        $_ENV['VAPOR_CACHE_JOB_ATTEMPTS'] = 'true';\n\n        $sqs = Mockery::mock(SqsClient::class);\n\n        $sqs->shouldReceive('deleteMessage')->once()->with([\n            'QueueUrl' => 'test-vapor-queue-url',\n            'ReceiptHandle' => 'my-job-receipt',\n        ]);\n\n        $job = new VaporJob($this->app, $sqs, [\n            'Body' => json_encode(['attempts' => 0]),\n            'MessageId' => 'my-job-id',\n            'ReceiptHandle' => 'my-job-receipt',\n        ], 'sqs', 'test-vapor-queue-url');\n\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n\n        $this->assertSame(3, $job->attempts());\n\n        $job->delete();\n\n        $this->assertSame(0, resolve(JobAttempts::class)->get($job));\n    }\n\n    public function test_job_fire_without_cache()\n    {\n        unset($_ENV['VAPOR_CACHE_JOB_ATTEMPTS']);\n\n        $sqs = Mockery::mock(SqsClient::class);\n\n        $sqs->shouldReceive('deleteMessage')->once()->with([\n            'QueueUrl' => 'test-vapor-queue-url',\n            'ReceiptHandle' => 'my-job-receipt',\n        ]);\n\n        $job = new FakeJob;\n\n        $job = new VaporJob($this->app, $sqs, [\n            'ReceiptHandle' => 'my-job-receipt',\n            'Body' => json_encode([\n                'displayName' => FakeJob::class,\n                'job' => 'Illuminate\\Queue\\CallQueuedHandler@call',\n                'maxTries' => null,\n                'timeout' => null,\n                'timeoutAt' => null,\n                'data' => [\n                    'commandName' => FakeJob::class,\n                    'command' => serialize($job),\n                ],\n                'attempts' => 3,\n            ]),\n            'MessageId' => 'my-job-id',\n        ], 'sqs', 'test-vapor-queue-url');\n\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n\n        $job->fire();\n\n        $this->assertSame(0, resolve(JobAttempts::class)->get($job));\n    }\n\n    public function test_job_fire_with_cache()\n    {\n        $_ENV['VAPOR_CACHE_JOB_ATTEMPTS'] = 'true';\n\n        $sqs = Mockery::mock(SqsClient::class);\n\n        $sqs->shouldReceive('deleteMessage')->once()->with([\n            'QueueUrl' => 'test-vapor-queue-url',\n            'ReceiptHandle' => 'my-job-receipt',\n        ]);\n\n        $job = new FakeJob;\n\n        $job = new VaporJob($this->app, $sqs, [\n            'ReceiptHandle' => 'my-job-receipt',\n            'Body' => json_encode([\n                'displayName' => FakeJob::class,\n                'job' => 'Illuminate\\Queue\\CallQueuedHandler@call',\n                'maxTries' => null,\n                'timeout' => null,\n                'timeoutAt' => null,\n                'data' => [\n                    'commandName' => FakeJob::class,\n                    'command' => serialize($job),\n                ],\n                'attempts' => 3,\n            ]),\n            'MessageId' => 'my-job-id',\n        ], 'sqs', 'test-vapor-queue-url');\n\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n        resolve(JobAttempts::class)->increment($job);\n\n        $job->fire();\n\n        $this->assertSame(0, resolve(JobAttempts::class)->get($job));\n    }\n}\n"
  },
  {
    "path": "tests/Feature/VaporQueueTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit;\n\nuse Aws\\Sqs\\SqsClient;\nuse Illuminate\\Cache\\ArrayStore;\nuse Laravel\\Vapor\\Queue\\JobAttempts;\nuse Laravel\\Vapor\\Queue\\VaporQueue;\nuse Laravel\\Vapor\\Tests\\TestCase;\nuse Laravel\\Vapor\\VaporServiceProvider;\nuse Mockery;\n\nclass VaporQueueTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        parent::setUp();\n\n        $this->app->singleton('cache.store', ArrayStore::class);\n    }\n\n    protected function getPackageProviders($app): array\n    {\n        return [\n            VaporServiceProvider::class,\n        ];\n    }\n\n    public function test_proper_payload_array_is_created()\n    {\n        $sqs = Mockery::mock(SqsClient::class);\n\n        $job = new FakeJob;\n\n        $sqs->shouldReceive('sendMessage')->once()->with(Mockery::on(function ($argument) use ($job) {\n            $messageBody = json_decode($argument['MessageBody'], true);\n\n            $this->assertSame('/test-vapor-queue-url', $argument['QueueUrl']);\n\n            $subset = [\n                'displayName' => FakeJob::class,\n                'job' => 'Illuminate\\Queue\\CallQueuedHandler@call',\n                'maxTries' => null,\n                'timeout' => null,\n                'attempts' => 0,\n            ];\n\n            foreach ($subset as $key => $value) {\n                $this->assertArrayHasKey($key, $messageBody);\n                $this->assertSame($value, $messageBody[$key]);\n            }\n\n            $this->assertArrayHasKey('data', $messageBody);\n            $this->assertSame(FakeJob::class, $messageBody['data']['commandName']);\n            $this->assertSame(serialize($job), $messageBody['data']['command']);\n\n            return true;\n        }))->andReturnSelf();\n\n        $sqs->shouldReceive('get')->andReturn('attribute-value');\n\n        $queue = new VaporQueue($sqs, 'test-vapor-queue-url');\n        $queue->setContainer($this->app);\n        $this->assertSame('attribute-value', $queue->push($job));\n    }\n\n    public function test_queue_pop()\n    {\n        $_ENV['VAPOR_CACHE_JOB_ATTEMPTS'] = 'true';\n\n        $sqs = Mockery::mock(SqsClient::class);\n\n        $job = new FakeJob;\n\n        $sqs->shouldReceive('receiveMessage')->once()->andReturn([\n            'Messages' => [\n                ['MessageId' => 'my-job-id'],\n            ],\n        ]);\n\n        $queue = new VaporQueue($sqs, 'test-vapor-queue-url');\n        $queue->setContainer($this->app);\n        $job = $queue->pop();\n\n        $this->assertSame(1, resolve(JobAttempts::class)->get('my-job-id'));\n    }\n}\n"
  },
  {
    "path": "tests/Fixtures/503.json",
    "content": "{\n    \"message\": \"We are currently down for maintenance.\"\n}\n"
  },
  {
    "path": "tests/Fixtures/asset.js",
    "content": "console.log();\n"
  },
  {
    "path": "tests/Fixtures/customLambdaEventFromSQS.json",
    "content": "{\n    \"Records\": [\n        {\n            \"messageId\": \"ddccab4e-f6fe-4a9a-aa18-b67ca8724d01\",\n            \"receiptHandle\": \"AQEBq42fiVBuPsL7mSHaAX7JqRNPgx\\/5a1o\\/ku1DFfrowMGI32C+1IHyaF9uHXjjJiLWE7JL8aUu0tb5yZoXbY+gEP\\/tyfONuOEqxqiU6UnWT8aBMtqRnuz+F4Y2BN\\/0lYxEJg4Pz849zxHtjvtkDw7zoB6SMCxAgE26UbSvIxAzNBLlU6sEQX24eKVBngEktA+i3TY9sCSuFy3lQte7yO+9ccmwbndxJ\\/HV9An9KOE3FtBVIoUCx6Oum4dm5MQoMcoqBUvYDbQLM8dLfAVFT72aOu3J+WbBbOfi7bMbvkPodvfQUcum9nWnpXbci0F91R4GDnyDJfzw5oCGKazeLbjUzr8zWSy8qX\\/bu3b99dE3nORQyI87OK7x8b3t+iFWzWPmCZwXh\\/MvWLn9CUntj0qMPw==\",\n            \"body\": \"{\\\"test\\\": \\\"123\\\"}\",\n            \"attributes\": {\n                \"ApproximateReceiveCount\": \"1\",\n                \"SentTimestamp\": \"1757361341318\",\n                \"SenderId\":\"AROATHDQZYADPZZTHGFLF:vapor-laravel-staging\",\n                \"ApproximateFirstReceiveTimestamp\": \"1757361341319\"\n            },\n            \"messageAttributes\": [],\n            \"md5OfBody\": \"9e536d7703a805854db06bdf6169656c\",\n            \"eventSource\": \"aws:sqs\",\n            \"eventSourceARN\":\"arn:aws:sqs:eu-west-3:221427384326:laravel-staging\",\n            \"awsRegion\": \"us-east-1\"\n        }\n    ]\n}\n"
  },
  {
    "path": "tests/Fixtures/customNonSQSLambdaEvent.json",
    "content": "{\n    \"Records\": [\n        {\n            \"receiptHandle\": \"AQEBq42fiVBuPsL7mSHaAX7JqRNPgx\\/5a1o\\/ku1DFfrowMGI32C+1IHyaF9uHXjjJiLWE7JL8aUu0tb5yZoXbY+gEP\\/tyfONuOEqxqiU6UnWT8aBMtqRnuz+F4Y2BN\\/0lYxEJg4Pz849zxHtjvtkDw7zoB6SMCxAgE26UbSvIxAzNBLlU6sEQX24eKVBngEktA+i3TY9sCSuFy3lQte7yO+9ccmwbndxJ\\/HV9An9KOE3FtBVIoUCx6Oum4dm5MQoMcoqBUvYDbQLM8dLfAVFT72aOu3J+WbBbOfi7bMbvkPodvfQUcum9nWnpXbci0F91R4GDnyDJfzw5oCGKazeLbjUzr8zWSy8qX\\/bu3b99dE3nORQyI87OK7x8b3t+iFWzWPmCZwXh\\/MvWLn9CUntj0qMPw==\",\n            \"body\": \"{\\\"test\\\": \\\"123\\\"}\",\n            \"attributes\": {\n                \"ApproximateReceiveCount\": \"1\",\n                \"SentTimestamp\": \"1757361341318\",\n                \"SenderId\":\"AROATHDQZYADPZZTHGFLF:vapor-laravel-staging\",\n                \"ApproximateFirstReceiveTimestamp\": \"1757361341319\"\n            },\n            \"messageAttributes\": [],\n            \"md5OfBody\": \"9e536d7703a805854db06bdf6169656c\",\n            \"eventSource\": \"aws:s3\",\n            \"eventSourceARN\":\"arn:aws:s3:eu-west-3:221427384326:laravel-staging\",\n            \"awsRegion\": \"us-east-1\"\n        }\n    ]\n}\n"
  },
  {
    "path": "tests/Fixtures/jobLambdaEventFromSQS.json",
    "content": "{\n   \"Records\":[\n      {\n         \"messageId\":\"58600123-d011-4d76-af5d-960159ca44aa\",\n         \"receiptHandle\":\"AQEBberAbZm/iuRDZevRaZ1cd1arwj3mHxvAZo/972KO8UH+HiNMTOMl66TPi/pZUbNYu+owiBzhyVGafAJuGDz9+LoyzEt6JqxMrzOKV7C3IO6wRZsUKRBKrlfr42KKP/+KS8zQUJE3QIgWiAwEfEwTnbSLhsxfqGxTFWzLh5+Or7u8U10p3K8tdDozssv2Hr39RhkiOKbuE2CS1U6f1oUvHowIr6o5vqNy9xxEiYr/XDXqbsReBE5zw531guvXxJagJjjKhxaNJoIozuYotF/+TeAz8/0Y0kuQTHZY0/tgS79MWGIPEL6izkF5uDm2lKo5PP4SKqfNMvNHS/i5u35mqzOQfHhJytLMWoRmCwUShI4KSaVNkkX+4ZyBpflOpLQl6u/DJ5TbfgkzWOJqhV+DQQ==\",\n         \"body\":\"{\\\"uuid\\\":\\\"0a0bcc75-f78b-4f15-b834-78e71c56afa3\\\",\\\"displayName\\\":\\\"Closure (web.php:19)\\\",\\\"job\\\":\\\"Illuminate\\\\\\\\Queue\\\\\\\\CallQueuedHandler@call\\\",\\\"maxTries\\\":null,\\\"maxExceptions\\\":null,\\\"failOnTimeout\\\":false,\\\"backoff\\\":null,\\\"timeout\\\":null,\\\"retryUntil\\\":null,\\\"data\\\":{\\\"commandName\\\":\\\"Illuminate\\\\\\\\Queue\\\\\\\\CallQueuedClosure\\\",\\\"command\\\":\\\"O:34:\\\\\\\"Illuminate\\\\\\\\Queue\\\\\\\\CallQueuedClosure\\\\\\\":14:{s:7:\\\\\\\"closure\\\\\\\";O:47:\\\\\\\"Laravel\\\\\\\\SerializableClosure\\\\\\\\SerializableClosure\\\\\\\":1:{s:12:\\\\\\\"serializable\\\\\\\";O:46:\\\\\\\"Laravel\\\\\\\\SerializableClosure\\\\\\\\Serializers\\\\\\\\Signed\\\\\\\":2:{s:12:\\\\\\\"serializable\\\\\\\";s:432:\\\\\\\"O:46:\\\\\\\"Laravel\\\\\\\\SerializableClosure\\\\\\\\Serializers\\\\\\\\Native\\\\\\\":5:{s:3:\\\\\\\"use\\\\\\\";a:1:{s:10:\\\\\\\"collection\\\\\\\";O:29:\\\\\\\"Illuminate\\\\\\\\Support\\\\\\\\Collection\\\\\\\":2:{s:8:\\\\\\\"\\\\u0000*\\\\u0000items\\\\\\\";a:1:{i:0;s:4:\\\\\\\"nuno\\\\\\\";}s:28:\\\\\\\"\\\\u0000*\\\\u0000escapeWhenCastingToString\\\\\\\";b:0;}}s:8:\\\\\\\"function\\\\\\\";s:79:\\\\\\\"function () use ($collection) {\\\\n \\\\\\\\info($collection->implode(','));\\\\n }\\\\\\\";s:5:\\\\\\\"scope\\\\\\\";s:37:\\\\\\\"Illuminate\\\\\\\\Routing\\\\\\\\RouteFileRegistrar\\\\\\\";s:4:\\\\\\\"this\\\\\\\";N;s:4:\\\\\\\"self\\\\\\\";s:32:\\\\\\\"00000000000001a10000000000000000\\\\\\\";}\\\\\\\";s:4:\\\\\\\"hash\\\\\\\";s:44:\\\\\\\"bl2j1wIRyXIqlgbMDpY7+kCIUvwcJwhHde9gTY7Ma4E=\\\\\\\";}}s:16:\\\\\\\"failureCallbacks\\\\\\\";a:0:{}s:23:\\\\\\\"deleteWhenMissingModels\\\\\\\";b:1;s:7:\\\\\\\"batchId\\\\\\\";N;s:3:\\\\\\\"job\\\\\\\";N;s:10:\\\\\\\"connection\\\\\\\";N;s:5:\\\\\\\"queue\\\\\\\";N;s:15:\\\\\\\"chainConnection\\\\\\\";N;s:10:\\\\\\\"chainQueue\\\\\\\";N;s:19:\\\\\\\"chainCatchCallbacks\\\\\\\";N;s:5:\\\\\\\"delay\\\\\\\";N;s:11:\\\\\\\"afterCommit\\\\\\\";N;s:10:\\\\\\\"middleware\\\\\\\";a:0:{}s:7:\\\\\\\"chained\\\\\\\";a:0:{}}\\\"},\\\"attempts\\\":0}\",\n         \"attributes\":{\n            \"ApproximateReceiveCount\":\"1\",\n            \"SentTimestamp\":\"1639158884706\",\n            \"SenderId\":\"AROATHDQZYADPZZTHGFLF:vapor-laravel-staging\",\n            \"ApproximateFirstReceiveTimestamp\":\"1639158884710\"\n         },\n         \"messageAttributes\":[\n\n         ],\n         \"md5OfBody\":\"28381da423cdb6fb5ba21f2eccb4fea1\",\n         \"eventSource\":\"aws:sqs\",\n         \"eventSourceARN\":\"arn:aws:sqs:eu-west-3:221427384326:laravel-staging\",\n         \"awsRegion\":\"eu-west-3\"\n      }\n   ]\n}"
  },
  {
    "path": "tests/TestCase.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests;\n\nuse Laravel\\Octane\\OctaneServiceProvider;\nuse Laravel\\Vapor\\VaporServiceProvider;\nuse Mockery;\nuse Orchestra\\Testbench\\TestCase as BaseTestCase;\n\nabstract class TestCase extends BaseTestCase\n{\n    protected function tearDown(): void\n    {\n        Mockery::close();\n\n        parent::tearDown();\n    }\n\n    protected function getPackageProviders($app)\n    {\n        return [\n            OctaneServiceProvider::class,\n            VaporServiceProvider::class,\n        ];\n    }\n}\n"
  },
  {
    "path": "tests/Unit/FakeJob.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit;\n\nclass FakeJob\n{\n    public static $handled = false;\n\n    public function handle()\n    {\n        static::$handled = true;\n    }\n}\n"
  },
  {
    "path": "tests/Unit/FpmRequestTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit;\n\nuse Carbon\\Carbon;\nuse Laravel\\Vapor\\Runtime\\Fpm\\FpmRequest;\nuse Mockery;\nuse PHPUnit\\Framework\\TestCase;\n\nclass FpmRequestTest extends TestCase\n{\n    public function setUp(): void\n    {\n        parent::setUp();\n\n        Carbon::setTestNow('2021-01-01 00:00:00');\n    }\n\n    protected function tearDown(): void\n    {\n        Mockery::close();\n    }\n\n    public function test_query_string_is_decoded_for_elb_requests()\n    {\n        $request = FpmRequest::fromLambdaEvent([\n            'httpMethod' => 'GET',\n            'multiValueQueryStringParameters' => [\n                'Host' => [$host = '2000-01-01%2000%3A00%3A00'],\n            ],\n            'requestContext' => [\n                'elb' => true,\n            ],\n        ]);\n\n        $this->assertSame(http_build_query(['Host' => urldecode($host)]), $request->serverVariables['QUERY_STRING']);\n    }\n\n    public function test_api_gateway_headers_are_handled()\n    {\n        $trace = ['Root=1-7696740c-c075312a25f21abe1ca19805;foobar'];\n        $for = ['172.105.167.153', '70.132.20.166'];\n        $port = ['443'];\n        $proto = ['https'];\n\n        $request = FpmRequest::fromLambdaEvent([\n            'httpMethod' => 'GET',\n            'multiValueHeaders' => [\n                'X-Amzn-Trace-Id' => $trace,\n                'X-Forwarded-For' => $for,\n                'X-Forwarded-Port' => $port,\n                'X-Forwarded-Proto' => $proto,\n            ],\n            'queryStringParameters' => null,\n            'multiValueQueryStringParameters' => null,\n        ]);\n\n        $this->assertSame('Root=1-7696740c-c075312a25f21abe1ca19805;foobar', $request->serverVariables['HTTP_X_AMZN_TRACE_ID']);\n        $this->assertSame('70.132.20.166', $request->serverVariables['HTTP_X_FORWARDED_FOR']);\n        $this->assertSame('443', $request->serverVariables['HTTP_X_FORWARDED_PORT']);\n        $this->assertSame('https', $request->serverVariables['HTTP_X_FORWARDED_PROTO']);\n    }\n\n    public function test_api_gateway_v2_headers_are_handled()\n    {\n        $trace = 'Root=1-7696740c-c075312a25f21abe1ca19805;foobar';\n        $for = '172.105.167.153,70.132.20.166';\n        $port = '443';\n        $proto = 'https';\n\n        $request = FpmRequest::fromLambdaEvent([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'protocol' => 'HTTP/1.1',\n                ],\n            ],\n            'headers' => [\n                'x-amzn-trace-id' => $trace,\n                'x-forwarded-for' => $for,\n                'x-forwarded-port' => $port,\n                'x-forwarded-proto' => $proto,\n            ],\n            'queryStringParameters' => null,\n        ]);\n\n        $this->assertSame('Root=1-7696740c-c075312a25f21abe1ca19805;foobar', $request->serverVariables['HTTP_X_AMZN_TRACE_ID']);\n        $this->assertSame('172.105.167.153,70.132.20.166', $request->serverVariables['HTTP_X_FORWARDED_FOR']);\n        $this->assertSame('443', $request->serverVariables['HTTP_X_FORWARDED_PORT']);\n        $this->assertSame('https', $request->serverVariables['HTTP_X_FORWARDED_PROTO']);\n    }\n\n    public function test_api_gateway_v2_query_parameters_are_handled()\n    {\n        $request = FpmRequest::fromLambdaEvent([\n            'version' => '2.0',\n            'requestContext' => [\n                'http' => [\n                    'method' => 'GET',\n                    'protocol' => 'HTTP/1.1',\n                ],\n            ],\n            'queryStringParameters' => [\n                'key1' => 'value1',\n                'key2' => 'value2,value3',\n            ],\n        ]);\n\n        $this->assertSame(\n            http_build_query([\n                'key1' => 'value1',\n                'key2' => ['value2', 'value3'],\n            ]),\n            $request->serverVariables['QUERY_STRING']\n        );\n    }\n\n    public function test_load_balancer_headers_are_over_spoofed_headers()\n    {\n        $request = FpmRequest::fromLambdaEvent([\n            'requestContext' => [\n                'elb' => [\n                    'targetGroupArn' => 'arn:aws:elasticloadbalancing:us-west-2:308264878215:targetgroup/vapor-staging/2aa8690968087e6e',\n                ],\n            ],\n            'httpMethod' => 'GET',\n            'multiValueQueryStringParameters' => [],\n            'multiValueHeaders' => [\n                'x-amzn-trace-id' => [\n                    'foobar',\n                    $trace = 'Root=1-7696740c-c075312a25f21abe1ca19805;foobar',\n                ],\n                'x-forwarded-for' => [\n                    '8.8.8.8',\n                    $for = '8.8.8.8, 172.105.167.153',\n                ],\n                'x-forwarded-port' => [\n                    '69',\n                    $port = '443',\n                ],\n                'x-forwarded-proto' => [\n                    'http',\n                    $proto = 'https',\n                ],\n            ],\n        ]);\n\n        $this->assertSame($trace, $request->serverVariables['HTTP_X_AMZN_TRACE_ID']);\n        $this->assertSame($for, $request->serverVariables['HTTP_X_FORWARDED_FOR']);\n        $this->assertSame($port, $request->serverVariables['HTTP_X_FORWARDED_PORT']);\n        $this->assertSame($proto, $request->serverVariables['HTTP_X_FORWARDED_PROTO']);\n    }\n\n    public function test_request_content_length_is_numeric()\n    {\n        $request = FpmRequest::fromLambdaEvent([\n            'httpMethod' => 'GET',\n            'headers' => [\n                // ..\n            ],\n        ]);\n\n        $this->assertSame(0, $request->getContentLength());\n\n        $request = FpmRequest::fromLambdaEvent([\n            'httpMethod' => 'GET',\n            'headers' => [\n                'content-length' => 1,\n            ],\n        ]);\n\n        $this->assertSame(1, $request->getContentLength());\n\n        $request = FpmRequest::fromLambdaEvent([\n            'httpMethod' => 'GET',\n            'headers' => [\n                'content-length' => '1',\n            ],\n        ]);\n\n        $this->assertSame(1, $request->getContentLength());\n\n        $request = FpmRequest::fromLambdaEvent([\n            'httpMethod' => 'GET',\n            'headers' => [\n                'content-length' => 'foo',\n            ],\n        ]);\n\n        $this->assertSame(0, $request->getContentLength());\n    }\n\n    public function test_api_gateway_v1_request_time_is_set()\n    {\n        $epoch = Carbon::now()->getPreciseTimestamp(3);\n\n        $request = FpmRequest::fromLambdaEvent([\n            'httpMethod' => 'GET',\n            'requestContext' => [\n                'requestTimeEpoch' => $epoch,\n            ],\n        ]);\n\n        $this->assertSame($epoch, $request->serverVariables['AWS_API_GATEWAY_REQUEST_TIME']);\n    }\n\n    public function test_api_gateway_v2_request_time_is_set()\n    {\n        $epoch = Carbon::now()->getPreciseTimestamp(3);\n\n        $request = FpmRequest::fromLambdaEvent([\n            'httpMethod' => 'GET',\n            'requestContext' => [\n                'timeEpoch' => $epoch,\n            ],\n        ]);\n\n        $this->assertSame($epoch, $request->serverVariables['AWS_API_GATEWAY_REQUEST_TIME']);\n    }\n\n    public function test_elb_request_time_is_not_set()\n    {\n        $request = FpmRequest::fromLambdaEvent([\n            'httpMethod' => 'GET',\n        ]);\n\n        $this->assertArrayNotHasKey('AWS_API_GATEWAY_REQUEST_TIME', $request->serverVariables);\n    }\n}\n"
  },
  {
    "path": "tests/Unit/HttpKernelTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Response;\nuse Laravel\\Vapor\\Runtime\\Http\\Middleware\\EnsureBinaryEncoding;\nuse Laravel\\Vapor\\Runtime\\HttpKernel;\nuse Mockery;\nuse PHPUnit\\Framework\\TestCase;\n\nclass HttpKernelTest extends TestCase\n{\n    protected function tearDown(): void\n    {\n        Mockery::close();\n    }\n\n    public function test_should_send_maintenance_mode_response_when_enabled_and_on_non_vanity_domain()\n    {\n        $_ENV['APP_VANITY_URL'] = 'https://something.com';\n        $_ENV['VAPOR_MAINTENANCE_MODE'] = 'true';\n\n        $this->assertTrue(HttpKernel::shouldSendMaintenanceModeResponse(Request::create('/', 'GET')));\n        $this->assertFalse(HttpKernel::shouldSendMaintenanceModeResponse(Request::create('http://something.com', 'GET')));\n\n        unset($_ENV['APP_VANITY_URL']);\n        unset($_ENV['VAPOR_MAINTENANCE_MODE']);\n\n        $this->assertFalse(HttpKernel::shouldSendMaintenanceModeResponse(Request::create('/', 'GET')));\n        $this->assertFalse(HttpKernel::shouldSendMaintenanceModeResponse(Request::create('http://something.com', 'GET')));\n    }\n\n    public function test_should_send_isbase64encode_on_binary_response()\n    {\n        $response = new Response('ok', 200);\n        $this->assertFalse(EnsureBinaryEncoding::isBase64EncodingRequired($response));\n\n        $response = new Response('{}', 200, [\n            'Content-Type' => 'application/json',\n        ]);\n        $this->assertFalse(EnsureBinaryEncoding::isBase64EncodingRequired($response));\n\n        $response = new Response('{}', 200, [\n            'Content-Type' => 'application/vnd.api+json; charset=UTF-8',\n        ]);\n        $this->assertFalse(EnsureBinaryEncoding::isBase64EncodingRequired($response));\n\n        $response = new Response('*', 200, [\n            'Content-Type' => 'application/octet-stream',\n        ]);\n        $this->assertTrue(EnsureBinaryEncoding::isBase64EncodingRequired($response));\n\n        $response = new Response('*', 200, [\n            'Content-Type' => 'image/png',\n        ]);\n        $this->assertTrue(EnsureBinaryEncoding::isBase64EncodingRequired($response));\n    }\n}\n"
  },
  {
    "path": "tests/Unit/LambdaEventTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit;\n\nuse Laravel\\Vapor\\Events\\LambdaEvent;\nuse PHPUnit\\Framework\\TestCase;\n\nclass LambdaEventTest extends TestCase\n{\n    public function test_to_array()\n    {\n        $event = $this->getEvent();\n\n        $this->assertIsArray($event->toArray());\n    }\n\n    public function test_array_access()\n    {\n        $event = $this->getEvent();\n\n        $this->assertIsArray($event['Records']);\n\n        $this->assertSame('58600123-d011-4d76-af5d-960159ca44aa', $event['Records.0.messageId']);\n        $this->assertSame('1', $event['Records.0.attributes.ApproximateReceiveCount']);\n\n        unset($event['Records']);\n        $this->assertFalse(isset($event['Records']));\n\n        $event['Records'] = [['messageId' => 'foo']];\n        $this->assertTrue(isset($event['Records']));\n        $this->assertSame('foo', $event['Records.0.messageId']);\n    }\n\n    public function getEvent()\n    {\n        return new LambdaEvent(json_decode(\n            file_get_contents(__DIR__.'/../Fixtures/jobLambdaEventFromSQS.json'),\n            true\n        ));\n    }\n}\n"
  },
  {
    "path": "tests/Unit/LoadBalancedLambdaResponseTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit;\n\nuse Laravel\\Vapor\\Runtime\\LoadBalancedLambdaResponse;\nuse PHPUnit\\Framework\\TestCase;\n\nclass LoadBalancedLambdaResponseTest extends TestCase\n{\n    public function test_header_values_are_always_strings()\n    {\n        $response = new LoadBalancedLambdaResponse(200, ['Foo-Bar' => [1]], 'body');\n\n        $elbResponse = $response->toApiGatewayFormat();\n\n        self::assertSame(['Foo-Bar' => ['1'], 'Content-Type' => ['text/html']], $elbResponse['multiValueHeaders']);\n    }\n}\n"
  },
  {
    "path": "tests/Unit/Logging/JsonFormatterTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit\\Logging;\n\nuse Laravel\\Vapor\\Logging\\JsonFormatter;\nuse Mockery;\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\nuse PHPUnit\\Framework\\TestCase;\n\nclass JsonFormatterTest extends TestCase\n{\n    protected function tearDown(): void\n    {\n        Mockery::close();\n\n        unset($_ENV['AWS_REQUEST_ID']);\n    }\n\n    public function test_format()\n    {\n        $formatter = new JsonFormatter();\n\n        if (class_exists(LogRecord::class)) {\n            $record = new LogRecord(\n                new \\DateTimeImmutable(),\n                'channel-test',\n                Level::Info,\n                'message-test',\n                ['context-test' => 'context-value'],\n                ['extra-test' => 'extra-value']\n            );\n        } else {\n            $record = [\n                'datetime' => new \\DateTimeImmutable(),\n                'channel' => 'channel-test',\n                'level' => 200,\n                'level_name' => 'INFO',\n                'message' => 'message-test',\n                'context' => ['context-test' => 'context-value'],\n                'extra' => ['extra-test' => 'extra-value'],\n            ];\n        }\n\n        $_ENV['AWS_REQUEST_ID'] = '123456789';\n\n        $record = $formatter->format($record);\n        $this->assertJson($record);\n\n        $record = json_decode($record, true);\n\n        if (class_exists(LogRecord::class)) {\n            $this->assertSame([\n                'message' => 'message-test',\n                'context' => [\n                    'context-test' => 'context-value',\n                    'aws_request_id' => '123456789',\n                ],\n                'level' => 200,\n                'level_name' => 'INFO',\n                'channel' => 'channel-test',\n                'datetime' => $record['datetime'],\n                'extra' => [\n                    'extra-test' => 'extra-value',\n                ],\n            ], $record);\n        } else {\n            $this->assertSame([\n                'datetime' => $record['datetime'],\n                'channel' => 'channel-test',\n                'level' => 200,\n                'level_name' => 'INFO',\n                'message' => 'message-test',\n                'context' => [\n                    'context-test' => 'context-value',\n                    'aws_request_id' => '123456789',\n                ],\n                'extra' => [\n                    'extra-test' => 'extra-value',\n                ],\n            ], $record);\n        }\n    }\n\n    public function test_includes_aws_request_id()\n    {\n        $formatter = new JsonFormatter();\n\n        $_ENV['AWS_REQUEST_ID'] = '123456789';\n\n        if (class_exists(LogRecord::class)) {\n            $record = new LogRecord(\n                new \\DateTimeImmutable(),\n                'channel-test',\n                Level::Info,\n                'message-test',\n                ['foo' => 'bar']\n            );\n        } else {\n            $record = [\n                'datetime' => new \\DateTimeImmutable(),\n                'channel' => 'channel-test',\n                'level' => 200,\n                'level_name' => 'INFO',\n                'message' => 'message-test',\n                'context' => ['foo' => 'bar'],\n                'extra' => [],\n            ];\n        }\n\n        $record = $formatter->format($record);\n        $this->assertJson($record);\n\n        $record = json_decode($record, true);\n        $this->assertSame(['foo' => 'bar', 'aws_request_id' => '123456789'], $record['context']);\n    }\n\n    public function test_aws_request_id_may_be_null()\n    {\n        $formatter = new JsonFormatter();\n\n        if (class_exists(LogRecord::class)) {\n            $record = new LogRecord(\n                new \\DateTimeImmutable(),\n                'channel-test',\n                Level::Info,\n                'message-test'\n            );\n        } else {\n            $record = [\n                'datetime' => new \\DateTimeImmutable(),\n                'channel' => 'channel-test',\n                'level' => 200,\n                'level_name' => 'INFO',\n                'message' => 'message-test',\n                'context' => [],\n                'extra' => [],\n            ];\n        }\n\n        $record = $formatter->format($record);\n        $this->assertJson($record);\n\n        $record = json_decode($record, true);\n        $this->assertSame(['aws_request_id' => null], $record['context']);\n    }\n}\n"
  },
  {
    "path": "tests/Unit/OctaneHttpHandlerFactoryTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit;\n\nif (\\PHP_VERSION_ID < 80000) {\n    return;\n}\n\nuse Laravel\\Vapor\\Runtime\\Handlers\\OctaneHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\UnknownEventHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\WarmerHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\WarmerPingHandler;\nuse Laravel\\Vapor\\Runtime\\Octane\\OctaneHttpHandlerFactory;\nuse Mockery;\nuse PHPUnit\\Framework\\TestCase;\n\nclass OctaneHttpHandlerFactoryTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        if (! class_exists(\\Laravel\\Octane\\Octane::class)) {\n            $this->markTestSkipped('Requires Laravel Octane.');\n        }\n\n        parent::setUp();\n    }\n\n    protected function tearDown(): void\n    {\n        parent::tearDown();\n\n        Mockery::close();\n    }\n\n    public function test_resolves_warmer()\n    {\n        $handler = OctaneHttpHandlerFactory::make([\n            'vaporWarmer' => true,\n        ]);\n\n        static::assertInstanceOf(WarmerHandler::class, $handler);\n    }\n\n    public function test_resolves_warmer_ping()\n    {\n        $handler = OctaneHttpHandlerFactory::make([\n            'vaporWarmerPing' => true,\n        ]);\n\n        static::assertInstanceOf(WarmerPingHandler::class, $handler);\n    }\n\n    public function test_resolves_octane()\n    {\n        $handler = OctaneHttpHandlerFactory::make([\n            'httpMethod' => true,\n        ]);\n\n        static::assertInstanceOf(OctaneHandler::class, $handler);\n    }\n\n    public function test_resolves_unknown()\n    {\n        $handler = OctaneHttpHandlerFactory::make([\n            // ..\n        ]);\n\n        static::assertInstanceOf(UnknownEventHandler::class, $handler);\n    }\n}\n"
  },
  {
    "path": "tests/Unit/QueueHandlerTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit;\n\nuse Laravel\\Vapor\\Events\\LambdaEvent;\nuse Laravel\\Vapor\\Runtime\\Handlers\\QueueHandler;\nuse Mockery;\nuse Orchestra\\Testbench\\TestCase;\n\nclass QueueHandlerTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        parent::setUp();\n\n        FakeJob::$handled = false;\n    }\n\n    protected function tearDown(): void\n    {\n        parent::tearDown();\n        Mockery::close();\n    }\n\n    public function test_job_can_be_called()\n    {\n        $this->assertFalse(FakeJob::$handled);\n\n        $job = new FakeJob;\n\n        $event = $this->getEvent();\n\n        $event['Records'][0]['body'] = json_encode([\n            'displayName' => FakeJob::class,\n            'job' => 'Illuminate\\Queue\\CallQueuedHandler@call',\n            'maxTries' => null,\n            'timeout' => null,\n            'timeoutAt' => null,\n            'data' => [\n                'commandName' => FakeJob::class,\n                'command' => serialize($job),\n            ],\n            'attempts' => 0,\n        ]);\n\n        QueueHandler::$app = $this->app;\n\n        $queueHandler = new QueueHandler();\n\n        $this->assertFalse(QueueHandler::$app->bound(LambdaEvent::class));\n        $queueHandler->handle($event);\n        $this->assertFalse(QueueHandler::$app->bound(LambdaEvent::class));\n        $this->assertTrue(FakeJob::$handled);\n    }\n\n    protected function getPackageProviders($app)\n    {\n        return [\n            \\Laravel\\Vapor\\VaporServiceProvider::class,\n        ];\n    }\n\n    protected function getEnvironmentSetUp($app)\n    {\n        $app['config']->set('queue.connections.vapor', [\n            'driver' => 'sqs',\n            'key' => env('SQS_KEY', 'your-public-key'),\n            'secret' => env('SQS_SECRET', 'your-secret-key'),\n            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),\n            'queue' => env('SQS_QUEUE', 'your-queue-name'),\n            'region' => env('SQS_REGION', 'us-east-1'),\n            'delay' => env('SQS_DELAY', 0),\n            'tries' => env('SQS_TRIES', 0),\n            'force' => env('SQS_FORCE', false),\n        ]);\n    }\n\n    protected function getEvent()\n    {\n        return json_decode(\n            file_get_contents(__DIR__.'/../Fixtures/jobLambdaEventFromSQS.json'),\n            true\n        );\n    }\n}\n"
  },
  {
    "path": "tests/Unit/Runtime/CliHandlerFactoryTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit\\Runtime;\n\nuse Laravel\\Vapor\\Runtime\\CliHandlerFactory;\nuse Laravel\\Vapor\\Runtime\\Handlers\\CliHandler;\nuse Laravel\\Vapor\\Runtime\\Handlers\\QueueHandler;\nuse Orchestra\\Testbench\\TestCase;\n\nclass CliHandlerFactoryTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        parent::setUp();\n\n        QueueHandler::$app = 'dummy';\n    }\n\n    protected function tearDown(): void\n    {\n        parent::tearDown();\n\n        CliHandlerFactory::createHandlersNormally();\n    }\n\n    public function test_custom_sqs_events_use_cli_handler()\n    {\n        $this->assertInstanceOf(CliHandler::class, CliHandlerFactory::make($this->getSQSCustomEvent()));\n    }\n\n    public function test_custom_non_sqs_lambda_events_use_cli_handler()\n    {\n        $this->assertInstanceOf(CliHandler::class, CliHandlerFactory::make($this->getCustomNonSQSLambdaEvent()));\n    }\n\n    public function test_laravel_jobs_use_queue_handler()\n    {\n        $this->assertInstanceOf(QueueHandler::class, CliHandlerFactory::make($this->getSQSJobEvent()));\n    }\n\n    public function test_custom_handler_factory_is_used_when_set()\n    {\n        CliHandlerFactory::createHandlerUsing(function ($event) {\n            return new CliHandler;\n        });\n\n        $this->assertInstanceOf(CliHandler::class, CliHandlerFactory::make($this->getSQSJobEvent()));\n    }\n\n    public function test_custom_handler_factory_receives_event()\n    {\n        $receivedEvent = null;\n\n        CliHandlerFactory::createHandlerUsing(function ($event) use (&$receivedEvent) {\n            $receivedEvent = $event;\n\n            return new CliHandler;\n        });\n\n        $expectedEvent = $this->getSQSJobEvent();\n        CliHandlerFactory::make($expectedEvent);\n\n        $this->assertSame($expectedEvent, $receivedEvent);\n    }\n\n    public function test_default_behavior_is_restored_after_reset()\n    {\n        CliHandlerFactory::createHandlerUsing(function ($event) {\n            return new CliHandler;\n        });\n\n        CliHandlerFactory::createHandlersNormally();\n\n        $this->assertInstanceOf(QueueHandler::class, CliHandlerFactory::make($this->getSQSJobEvent()));\n    }\n\n    protected function getCustomNonSQSLambdaEvent()\n    {\n        return json_decode(\n            file_get_contents(__DIR__.'/../../Fixtures/customNonSQSLambdaEvent.json'),\n            true\n        );\n    }\n\n    protected function getSQSJobEvent()\n    {\n        return json_decode(\n            file_get_contents(__DIR__.'/../../Fixtures/jobLambdaEventFromSQS.json'),\n            true\n        );\n    }\n\n    protected function getSQSCustomEvent()\n    {\n        return json_decode(\n            file_get_contents(__DIR__.'/../../Fixtures/customLambdaEventFromSQS.json'),\n            true\n        );\n    }\n}\n"
  },
  {
    "path": "tests/Unit/VaporConnectorTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit;\n\nuse Laravel\\Vapor\\Queue\\VaporConnector;\nuse Laravel\\Vapor\\Queue\\VaporQueue;\nuse PHPUnit\\Framework\\TestCase;\n\nclass VaporConnectorTest extends TestCase\n{\n    public function test_can_create_vapor_queue()\n    {\n        $queue = (new VaporConnector)->connect([\n            'driver' => 'sqs',\n            'key' => 'test-key',\n            'secret' => 'test-secret',\n            'prefix' => 'https://sqs.us-east-1.amazonaws.com/111111111',\n            'queue' => 'test-queue',\n            'region' => 'us-east-1',\n        ]);\n\n        $this->assertInstanceOf(VaporQueue::class, $queue);\n    }\n}\n"
  },
  {
    "path": "tests/Unit/VaporScheduleCommandTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Cache\\Repository;\nuse Illuminate\\Support\\Facades\\Cache;\nuse Illuminate\\Support\\Str;\nuse Laravel\\Vapor\\VaporServiceProvider;\nuse Mockery;\nuse Orchestra\\Testbench\\TestCase;\n\nclass VaporScheduleCommandTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        parent::setUp();\n\n        Carbon::setTestNow('2021-01-01 00:00:00');\n\n        Str::createUuidsUsing(function () {\n            return 'test-schedule-lock-key';\n        });\n    }\n\n    protected function getPackageProviders($app): array\n    {\n        return [\n            VaporServiceProvider::class,\n        ];\n    }\n\n    public function test_scheduler_is_invoked_when_invalid_cache_is_configured()\n    {\n        $fake = Mockery::mock(Repository::class);\n        Cache::shouldReceive('getDefaultDriver')->once()->andReturn('array');\n        $fake->shouldNotReceive('remember');\n        if (version_compare($this->app->version(), 10, 'eq')) {\n            $fake->shouldReceive('forget')->once()->with('illuminate:schedule:interrupt')->andReturn(true);\n        }\n        if (version_compare($this->app->version(), 11, '>=')) {\n            Cache::shouldReceive('driver')->twice()->andReturn($fake);\n        } elseif (! Str::startsWith($this->app->version(), '9')) {\n            Cache::shouldReceive('driver')->once()->andReturn($fake);\n        }\n        $fake->shouldNotReceive('forget')->with('vapor:schedule:lock');\n        if (version_compare($this->app->version(), '13.0.0', '>=')) {\n            $fake->shouldReceive('get')->with('illuminate:schedule:paused', false)->andReturn(false);\n        }\n\n        $this->artisan('vapor:schedule')\n            ->assertExitCode(0);\n    }\n\n    public function test_scheduler_is_called_at_the_top_of_the_minute()\n    {\n        Cache::shouldReceive('getDefaultDriver')->once()->andReturn('dynamodb');\n        Cache::shouldReceive('driver')->andReturn($fake = Mockery::mock(Repository::class));\n        $fake->shouldReceive('remember')->once()->with('vapor:schedule:lock', 60, Mockery::any())->andReturn('test-schedule-lock-key');\n        if (version_compare($this->app->version(), 10, 'eq')) {\n            $fake->shouldReceive('forget')->once()->with('illuminate:schedule:interrupt')->andReturn(true);\n        }\n        $fake->shouldReceive('forget')->once()->with('vapor:schedule:lock')->andReturn(true);\n        if (version_compare($this->app->version(), '13.0.0', '>=')) {\n            $fake->shouldReceive('get')->with('illuminate:schedule:paused', false)->andReturn(false);\n        }\n\n        $this->artisan('vapor:schedule')\n            ->assertExitCode(0);\n    }\n\n    public function test_scheduler_is_not_invoked_if_lock_cannot_be_obtained()\n    {\n        Cache::shouldReceive('getDefaultDriver')->once()->andReturn('dynamodb');\n        Cache::shouldReceive('driver')->andReturn($fake = Mockery::mock(Repository::class));\n        $fake->shouldReceive('remember')->once()->with('vapor:schedule:lock', 60, Mockery::any())->andReturn('test-locked-schedule-lock-key');\n        $fake->shouldNotReceive('forget')->with('illuminate:schedule:interrupt')->andReturn(true);\n        $fake->shouldNotReceive('forget')->with('vapor:schedule:lock');\n\n        $this->artisan('vapor:schedule')\n            ->assertExitCode(1);\n    }\n}\n"
  },
  {
    "path": "tests/Unit/VaporTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit;\n\nuse Laravel\\Vapor\\Vapor;\nuse Orchestra\\Testbench\\TestCase;\n\nclass VaporTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        parent::setUp();\n\n        unset($_ENV['VAPOR_SSM_PATH']);\n    }\n\n    public function test_vapor_active()\n    {\n        $_ENV['VAPOR_SSM_PATH'] = '/my-project-production';\n\n        $this->assertTrue(Vapor::active());\n    }\n\n    public function test_vapor_inactive()\n    {\n        $this->assertTrue(Vapor::inactive());\n    }\n\n    public function test_vapor_when_active()\n    {\n        $_ENV['VAPOR_SSM_PATH'] = '/my-project-production';\n\n        $this->assertSame('active', Vapor::whenActive('active', 'inactive'));\n    }\n\n    public function test_vapor_when_active_with_callback()\n    {\n        $_ENV['VAPOR_SSM_PATH'] = '/my-project-production';\n\n        $this->assertSame('active', Vapor::whenActive(function () {\n            return 'active';\n        }, 'inactive'));\n    }\n\n    public function test_vapor_when_inactive()\n    {\n        $this->assertSame('inactive', Vapor::whenInactive('inactive', 'active'));\n    }\n\n    public function test_vapor_when_inactive_with_callback()\n    {\n        $this->assertSame('inactive', Vapor::whenInactive(function () {\n            return 'inactive';\n        }, 'active'));\n    }\n}\n"
  },
  {
    "path": "tests/Unit/VaporWorkCommandTest.php",
    "content": "<?php\n\nnamespace Laravel\\Vapor\\Tests\\Unit;\n\nuse Laravel\\Vapor\\Events\\LambdaEvent;\nuse Mockery;\nuse Orchestra\\Testbench\\TestCase;\n\nclass VaporWorkCommandTest extends TestCase\n{\n    protected function setUp(): void\n    {\n        parent::setUp();\n\n        FakeJob::$handled = false;\n    }\n\n    protected function tearDown(): void\n    {\n        parent::tearDown();\n        Mockery::close();\n    }\n\n    public function test_command_can_be_called()\n    {\n        $this->assertFalse(FakeJob::$handled);\n\n        $job = new FakeJob;\n\n        $event = $this->getEvent();\n\n        $event['Records.0.body'] = json_encode([\n            'displayName' => FakeJob::class,\n            'job' => 'Illuminate\\Queue\\CallQueuedHandler@call',\n            'maxTries' => null,\n            'timeout' => null,\n            'timeoutAt' => null,\n            'data' => [\n                'commandName' => FakeJob::class,\n                'command' => serialize($job),\n            ],\n            'attempts' => 0,\n        ]);\n\n        $this->instance(LambdaEvent::class, $event);\n\n        $this->artisan('vapor:work');\n\n        $this->assertTrue(FakeJob::$handled);\n    }\n\n    protected function getPackageProviders($app)\n    {\n        return [\n            \\Laravel\\Vapor\\VaporServiceProvider::class,\n        ];\n    }\n\n    protected function getEnvironmentSetUp($app)\n    {\n        $app['config']->set('queue.connections.vapor', [\n            'driver' => 'sqs',\n            'key' => env('SQS_KEY', 'your-public-key'),\n            'secret' => env('SQS_SECRET', 'your-secret-key'),\n            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),\n            'queue' => env('SQS_QUEUE', 'your-queue-name'),\n            'region' => env('SQS_REGION', 'us-east-1'),\n            'delay' => env('SQS_DELAY', 0),\n            'tries' => env('SQS_TRIES', 0),\n            'force' => env('SQS_FORCE', false),\n        ]);\n    }\n\n    protected function getEvent()\n    {\n        return new LambdaEvent(json_decode(\n            file_get_contents(__DIR__.'/../Fixtures/jobLambdaEventFromSQS.json'),\n            true\n        ));\n    }\n}\n"
  }
]