Browse Source

composer require aws/aws-sdk-php

lizhen_gitee 1 năm trước cách đây
mục cha
commit
c09633cdcb
100 tập tin đã thay đổi với 10830 bổ sung10 xóa
  1. 2 1
      .gitignore
  2. 2 1
      composer.json
  3. 3537 0
      composer.lock
  4. 1 1
      thinkphp/base.php
  5. 3 3
      thinkphp/library/think/App.php
  6. 7 1
      thinkphp/library/think/Lang.php
  7. 2 2
      thinkphp/library/think/Model.php
  8. 1 1
      vendor/autoload.php
  9. 4 0
      vendor/aws/aws-crt-php/CODE_OF_CONDUCT.md
  10. 175 0
      vendor/aws/aws-crt-php/LICENSE
  11. 1 0
      vendor/aws/aws-crt-php/NOTICE
  12. 117 0
      vendor/aws/aws-crt-php/README.md
  13. 35 0
      vendor/aws/aws-crt-php/composer.json
  14. 69 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Auth/AwsCredentials.php
  15. 23 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Auth/CredentialsProvider.php
  16. 43 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Auth/Signable.php
  17. 15 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SignatureType.php
  18. 11 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SignedBodyHeaderType.php
  19. 22 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Auth/Signing.php
  20. 11 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningAlgorithm.php
  21. 75 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningConfigAWS.php
  22. 33 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningResult.php
  23. 35 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Auth/StaticCredentialsProvider.php
  24. 358 0
      vendor/aws/aws-crt-php/src/AWS/CRT/CRT.php
  25. 50 0
      vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Headers.php
  26. 95 0
      vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Message.php
  27. 32 0
      vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Request.php
  28. 27 0
      vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Response.php
  29. 39 0
      vendor/aws/aws-crt-php/src/AWS/CRT/IO/EventLoopGroup.php
  30. 50 0
      vendor/aws/aws-crt-php/src/AWS/CRT/IO/InputStream.php
  31. 37 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Internal/Encoding.php
  32. 29 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Internal/Extension.php
  33. 47 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Log.php
  34. 42 0
      vendor/aws/aws-crt-php/src/AWS/CRT/NativeResource.php
  35. 77 0
      vendor/aws/aws-crt-php/src/AWS/CRT/Options.php
  36. 4 0
      vendor/aws/aws-sdk-php/CODE_OF_CONDUCT.md
  37. 4 0
      vendor/aws/aws-sdk-php/CRT_INSTRUCTIONS.md
  38. 141 0
      vendor/aws/aws-sdk-php/LICENSE
  39. 17 0
      vendor/aws/aws-sdk-php/NOTICE
  40. 84 0
      vendor/aws/aws-sdk-php/THIRD-PARTY-LICENSES
  41. 74 0
      vendor/aws/aws-sdk-php/composer.json
  42. 55 0
      vendor/aws/aws-sdk-php/src/ACMPCA/ACMPCAClient.php
  43. 9 0
      vendor/aws/aws-sdk-php/src/ACMPCA/Exception/ACMPCAException.php
  44. 31 0
      vendor/aws/aws-sdk-php/src/ARCZonalShift/ARCZonalShiftClient.php
  45. 9 0
      vendor/aws/aws-sdk-php/src/ARCZonalShift/Exception/ARCZonalShiftException.php
  46. 157 0
      vendor/aws/aws-sdk-php/src/AbstractConfigurationProvider.php
  47. 73 0
      vendor/aws/aws-sdk-php/src/AccessAnalyzer/AccessAnalyzerClient.php
  48. 9 0
      vendor/aws/aws-sdk-php/src/AccessAnalyzer/Exception/AccessAnalyzerException.php
  49. 27 0
      vendor/aws/aws-sdk-php/src/Account/AccountClient.php
  50. 9 0
      vendor/aws/aws-sdk-php/src/Account/Exception/AccountException.php
  51. 40 0
      vendor/aws/aws-sdk-php/src/Acm/AcmClient.php
  52. 9 0
      vendor/aws/aws-sdk-php/src/Acm/Exception/AcmException.php
  53. 195 0
      vendor/aws/aws-sdk-php/src/AlexaForBusiness/AlexaForBusinessClient.php
  54. 9 0
      vendor/aws/aws-sdk-php/src/AlexaForBusiness/Exception/AlexaForBusinessException.php
  55. 83 0
      vendor/aws/aws-sdk-php/src/Amplify/AmplifyClient.php
  56. 9 0
      vendor/aws/aws-sdk-php/src/Amplify/Exception/AmplifyException.php
  57. 71 0
      vendor/aws/aws-sdk-php/src/AmplifyBackend/AmplifyBackendClient.php
  58. 9 0
      vendor/aws/aws-sdk-php/src/AmplifyBackend/Exception/AmplifyBackendException.php
  59. 59 0
      vendor/aws/aws-sdk-php/src/AmplifyUIBuilder/AmplifyUIBuilderClient.php
  60. 9 0
      vendor/aws/aws-sdk-php/src/AmplifyUIBuilder/Exception/AmplifyUIBuilderException.php
  61. 89 0
      vendor/aws/aws-sdk-php/src/Api/AbstractModel.php
  62. 244 0
      vendor/aws/aws-sdk-php/src/Api/ApiProvider.php
  63. 124 0
      vendor/aws/aws-sdk-php/src/Api/DateTimeResult.php
  64. 138 0
      vendor/aws/aws-sdk-php/src/Api/DocModel.php
  65. 95 0
      vendor/aws/aws-sdk-php/src/Api/ErrorParser/AbstractErrorParser.php
  66. 52 0
      vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonParserTrait.php
  67. 49 0
      vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonRpcErrorParser.php
  68. 58 0
      vendor/aws/aws-sdk-php/src/Api/ErrorParser/RestJsonErrorParser.php
  69. 111 0
      vendor/aws/aws-sdk-php/src/Api/ErrorParser/XmlErrorParser.php
  70. 35 0
      vendor/aws/aws-sdk-php/src/Api/ListShape.php
  71. 54 0
      vendor/aws/aws-sdk-php/src/Api/MapShape.php
  72. 142 0
      vendor/aws/aws-sdk-php/src/Api/Operation.php
  73. 46 0
      vendor/aws/aws-sdk-php/src/Api/Parser/AbstractParser.php
  74. 184 0
      vendor/aws/aws-sdk-php/src/Api/Parser/AbstractRestParser.php
  75. 54 0
      vendor/aws/aws-sdk-php/src/Api/Parser/Crc32ValidatingParser.php
  76. 340 0
      vendor/aws/aws-sdk-php/src/Api/Parser/DecodingEventStreamIterator.php
  77. 156 0
      vendor/aws/aws-sdk-php/src/Api/Parser/EventParsingIterator.php
  78. 56 0
      vendor/aws/aws-sdk-php/src/Api/Parser/Exception/ParserException.php
  79. 71 0
      vendor/aws/aws-sdk-php/src/Api/Parser/JsonParser.php
  80. 51 0
      vendor/aws/aws-sdk-php/src/Api/Parser/JsonRpcParser.php
  81. 90 0
      vendor/aws/aws-sdk-php/src/Api/Parser/MetadataParserTrait.php
  82. 61 0
      vendor/aws/aws-sdk-php/src/Api/Parser/PayloadParserTrait.php
  83. 60 0
      vendor/aws/aws-sdk-php/src/Api/Parser/QueryParser.php
  84. 49 0
      vendor/aws/aws-sdk-php/src/Api/Parser/RestJsonParser.php
  85. 42 0
      vendor/aws/aws-sdk-php/src/Api/Parser/RestXmlParser.php
  86. 179 0
      vendor/aws/aws-sdk-php/src/Api/Parser/XmlParser.php
  87. 40 0
      vendor/aws/aws-sdk-php/src/Api/Serializer/Ec2ParamBuilder.php
  88. 108 0
      vendor/aws/aws-sdk-php/src/Api/Serializer/JsonBody.php
  89. 84 0
      vendor/aws/aws-sdk-php/src/Api/Serializer/JsonRpcSerializer.php
  90. 157 0
      vendor/aws/aws-sdk-php/src/Api/Serializer/QueryParamBuilder.php
  91. 81 0
      vendor/aws/aws-sdk-php/src/Api/Serializer/QuerySerializer.php
  92. 42 0
      vendor/aws/aws-sdk-php/src/Api/Serializer/RestJsonSerializer.php
  93. 310 0
      vendor/aws/aws-sdk-php/src/Api/Serializer/RestSerializer.php
  94. 48 0
      vendor/aws/aws-sdk-php/src/Api/Serializer/RestXmlSerializer.php
  95. 220 0
      vendor/aws/aws-sdk-php/src/Api/Serializer/XmlBody.php
  96. 535 0
      vendor/aws/aws-sdk-php/src/Api/Service.php
  97. 77 0
      vendor/aws/aws-sdk-php/src/Api/Shape.php
  98. 68 0
      vendor/aws/aws-sdk-php/src/Api/ShapeMap.php
  99. 79 0
      vendor/aws/aws-sdk-php/src/Api/StructureShape.php
  100. 48 0
      vendor/aws/aws-sdk-php/src/Api/TimestampShape.php

+ 2 - 1
.gitignore

@@ -4,4 +4,5 @@
 /nginx.htaccess
 /public/nginx.htaccess
 /runtime/*
-/public/uploads/*
+/public/uploads/*
+hitpay

+ 2 - 1
composer.json

@@ -30,7 +30,8 @@
         "ext-curl": "*",
         "ext-pdo": "*",
         "ext-bcmath": "*",
-        "txthinking/mailer": "^2.0"
+        "txthinking/mailer": "^2.0",
+        "aws/aws-sdk-php": "^3.295"
     },
     "config": {
         "preferred-install": "dist"

+ 3537 - 0
composer.lock

@@ -0,0 +1,3537 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "63817e5296815cc430f881c477d216cc",
+    "packages": [
+        {
+            "name": "aws/aws-crt-php",
+            "version": "v1.2.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/awslabs/aws-crt-php.git",
+                "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/eb0c6e4e142224a10b08f49ebf87f32611d162b2",
+                "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5",
+                "yoast/phpunit-polyfills": "^1.0"
+            },
+            "suggest": {
+                "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality."
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "AWS SDK Common Runtime Team",
+                    "email": "aws-sdk-common-runtime@amazon.com"
+                }
+            ],
+            "description": "AWS Common Runtime for PHP",
+            "homepage": "https://github.com/awslabs/aws-crt-php",
+            "keywords": [
+                "amazon",
+                "aws",
+                "crt",
+                "sdk"
+            ],
+            "support": {
+                "issues": "https://github.com/awslabs/aws-crt-php/issues",
+                "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.4"
+            },
+            "time": "2023-11-08T00:42:13+00:00"
+        },
+        {
+            "name": "aws/aws-sdk-php",
+            "version": "3.295.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/aws/aws-sdk-php.git",
+                "reference": "326eb6c26e2be9d896c4aeb025e20980c06779af"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/326eb6c26e2be9d896c4aeb025e20980c06779af",
+                "reference": "326eb6c26e2be9d896c4aeb025e20980c06779af",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "aws/aws-crt-php": "^1.2.3",
+                "ext-json": "*",
+                "ext-pcre": "*",
+                "ext-simplexml": "*",
+                "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5",
+                "guzzlehttp/promises": "^1.4.0 || ^2.0",
+                "guzzlehttp/psr7": "^1.9.1 || ^2.4.5",
+                "mtdowling/jmespath.php": "^2.6",
+                "php": ">=7.2.5",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "require-dev": {
+                "andrewsville/php-token-reflection": "^1.4",
+                "aws/aws-php-sns-message-validator": "~1.0",
+                "behat/behat": "~3.0",
+                "composer/composer": "^1.10.22",
+                "dms/phpunit-arraysubset-asserts": "^0.4.0",
+                "doctrine/cache": "~1.4",
+                "ext-dom": "*",
+                "ext-openssl": "*",
+                "ext-pcntl": "*",
+                "ext-sockets": "*",
+                "nette/neon": "^2.3",
+                "paragonie/random_compat": ">= 2",
+                "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5",
+                "psr/cache": "^1.0",
+                "psr/simple-cache": "^1.0",
+                "sebastian/comparator": "^1.2.3 || ^4.0",
+                "yoast/phpunit-polyfills": "^1.0"
+            },
+            "suggest": {
+                "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications",
+                "doctrine/cache": "To use the DoctrineCacheAdapter",
+                "ext-curl": "To send requests using cURL",
+                "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages",
+                "ext-sockets": "To use client-side monitoring"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions.php"
+                ],
+                "psr-4": {
+                    "Aws\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Amazon Web Services",
+                    "homepage": "http://aws.amazon.com"
+                }
+            ],
+            "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
+            "homepage": "http://aws.amazon.com/sdkforphp",
+            "keywords": [
+                "amazon",
+                "aws",
+                "cloud",
+                "dynamodb",
+                "ec2",
+                "glacier",
+                "s3",
+                "sdk"
+            ],
+            "support": {
+                "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
+                "issues": "https://github.com/aws/aws-sdk-php/issues",
+                "source": "https://github.com/aws/aws-sdk-php/tree/3.295.0"
+            },
+            "time": "2023-12-22T19:07:47+00:00"
+        },
+        {
+            "name": "easywechat-composer/easywechat-composer",
+            "version": "1.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/mingyoung/easywechat-composer.git",
+                "reference": "3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/mingyoung/easywechat-composer/zipball/3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd",
+                "reference": "3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "composer-plugin-api": "^1.0 || ^2.0",
+                "php": ">=7.0"
+            },
+            "require-dev": {
+                "composer/composer": "^1.0 || ^2.0",
+                "phpunit/phpunit": "^6.5 || ^7.0"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "EasyWeChatComposer\\Plugin"
+            },
+            "autoload": {
+                "psr-4": {
+                    "EasyWeChatComposer\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "张铭阳",
+                    "email": "mingyoungcheung@gmail.com"
+                }
+            ],
+            "description": "The composer plugin for EasyWeChat",
+            "support": {
+                "issues": "https://github.com/mingyoung/easywechat-composer/issues",
+                "source": "https://github.com/mingyoung/easywechat-composer/tree/1.4.1"
+            },
+            "time": "2021-07-05T04:03:22+00:00"
+        },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "6.5.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981",
+                "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/promises": "^1.0",
+                "guzzlehttp/psr7": "^1.9",
+                "php": ">=5.5",
+                "symfony/polyfill-intl-idn": "^1.17"
+            },
+            "require-dev": {
+                "ext-curl": "*",
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
+                "psr/log": "^1.1"
+            },
+            "suggest": {
+                "psr/log": "Required for using the Log middleware"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "6.5-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Jeremy Lindblom",
+                    "email": "jeremeamia@gmail.com",
+                    "homepage": "https://github.com/jeremeamia"
+                },
+                {
+                    "name": "George Mponos",
+                    "email": "gmponos@gmail.com",
+                    "homepage": "https://github.com/gmponos"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://github.com/sagikazarmark"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "Guzzle is a PHP HTTP client library",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "rest",
+                "web service"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/guzzle/issues",
+                "source": "https://github.com/guzzle/guzzle/tree/6.5.8"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-06-20T22:16:07+00:00"
+        },
+        {
+            "name": "guzzlehttp/promises",
+            "version": "1.5.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/promises.git",
+                "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e",
+                "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "^4.4 || ^5.1"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "GuzzleHttp\\Promise\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "Guzzle promises library",
+            "keywords": [
+                "promise"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/promises/issues",
+                "source": "https://github.com/guzzle/promises/tree/1.5.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-05-21T12:31:43+00:00"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "1.9.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/psr7.git",
+                "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b",
+                "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.4.0",
+                "psr/http-message": "~1.0",
+                "ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
+            },
+            "provide": {
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "ext-zlib": "*",
+                "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
+            },
+            "suggest": {
+                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "GuzzleHttp\\Psr7\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "George Mponos",
+                    "email": "gmponos@gmail.com",
+                    "homepage": "https://github.com/gmponos"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://github.com/sagikazarmark"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "PSR-7 message implementation that also provides common utility methods",
+            "keywords": [
+                "http",
+                "message",
+                "psr-7",
+                "request",
+                "response",
+                "stream",
+                "uri",
+                "url"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/psr7/issues",
+                "source": "https://github.com/guzzle/psr7/tree/1.9.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-04-17T16:00:37+00:00"
+        },
+        {
+            "name": "karsonzhang/fastadmin-addons",
+            "version": "1.3.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/karsonzhang/fastadmin-addons.git",
+                "reference": "f5bb4dabda55271b08371a8ae9355a205be48c56"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/karsonzhang/fastadmin-addons/zipball/f5bb4dabda55271b08371a8ae9355a205be48c56",
+                "reference": "f5bb4dabda55271b08371a8ae9355a205be48c56",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "nelexa/zip": "^3.3",
+                "php": ">=7.0.0",
+                "symfony/var-exporter": "^4.4.13"
+            },
+            "type": "library",
+            "extra": {
+                "think-config": {
+                    "addons": "src/config.php"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/common.php"
+                ],
+                "psr-4": {
+                    "think\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Karson",
+                    "email": "karson@fastadmin.net"
+                },
+                {
+                    "name": "xiaobo.sun",
+                    "email": "xiaobo.sun@qq.com"
+                }
+            ],
+            "description": "addons package for fastadmin",
+            "homepage": "https://github.com/karsonzhang/fastadmin-addons",
+            "support": {
+                "issues": "https://github.com/karsonzhang/fastadmin-addons/issues",
+                "source": "https://github.com/karsonzhang/fastadmin-addons/tree/v1.3.3"
+            },
+            "time": "2022-05-27T09:30:12+00:00"
+        },
+        {
+            "name": "markbaker/complex",
+            "version": "1.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/MarkBaker/PHPComplex.git",
+                "reference": "c3131244e29c08d44fefb49e0dd35021e9e39dd2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/c3131244e29c08d44fefb49e0dd35021e9e39dd2",
+                "reference": "c3131244e29c08d44fefb49e0dd35021e9e39dd2",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^5.6.0|^7.0"
+            },
+            "require-dev": {
+                "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0",
+                "phpcompatibility/php-compatibility": "^9.0",
+                "phpdocumentor/phpdocumentor": "2.*",
+                "phploc/phploc": "^4.0|^5.0|^6.0|^7.0",
+                "phpmd/phpmd": "2.*",
+                "phpunit/phpunit": "^4.8.35|^5.0|^6.0|^7.0",
+                "sebastian/phpcpd": "2.*",
+                "squizlabs/php_codesniffer": "^3.4.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "classes/src/functions/abs.php",
+                    "classes/src/functions/acos.php",
+                    "classes/src/functions/acosh.php",
+                    "classes/src/functions/acot.php",
+                    "classes/src/functions/acoth.php",
+                    "classes/src/functions/acsc.php",
+                    "classes/src/functions/acsch.php",
+                    "classes/src/functions/argument.php",
+                    "classes/src/functions/asec.php",
+                    "classes/src/functions/asech.php",
+                    "classes/src/functions/asin.php",
+                    "classes/src/functions/asinh.php",
+                    "classes/src/functions/atan.php",
+                    "classes/src/functions/atanh.php",
+                    "classes/src/functions/conjugate.php",
+                    "classes/src/functions/cos.php",
+                    "classes/src/functions/cosh.php",
+                    "classes/src/functions/cot.php",
+                    "classes/src/functions/coth.php",
+                    "classes/src/functions/csc.php",
+                    "classes/src/functions/csch.php",
+                    "classes/src/functions/exp.php",
+                    "classes/src/functions/inverse.php",
+                    "classes/src/functions/ln.php",
+                    "classes/src/functions/log2.php",
+                    "classes/src/functions/log10.php",
+                    "classes/src/functions/negative.php",
+                    "classes/src/functions/pow.php",
+                    "classes/src/functions/rho.php",
+                    "classes/src/functions/sec.php",
+                    "classes/src/functions/sech.php",
+                    "classes/src/functions/sin.php",
+                    "classes/src/functions/sinh.php",
+                    "classes/src/functions/sqrt.php",
+                    "classes/src/functions/tan.php",
+                    "classes/src/functions/tanh.php",
+                    "classes/src/functions/theta.php",
+                    "classes/src/operations/add.php",
+                    "classes/src/operations/subtract.php",
+                    "classes/src/operations/multiply.php",
+                    "classes/src/operations/divideby.php",
+                    "classes/src/operations/divideinto.php"
+                ],
+                "psr-4": {
+                    "Complex\\": "classes/src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mark Baker",
+                    "email": "mark@lange.demon.co.uk"
+                }
+            ],
+            "description": "PHP Class for working with complex numbers",
+            "homepage": "https://github.com/MarkBaker/PHPComplex",
+            "keywords": [
+                "complex",
+                "mathematics"
+            ],
+            "support": {
+                "issues": "https://github.com/MarkBaker/PHPComplex/issues",
+                "source": "https://github.com/MarkBaker/PHPComplex/tree/1.5.0"
+            },
+            "time": "2020-08-26T19:47:57+00:00"
+        },
+        {
+            "name": "markbaker/matrix",
+            "version": "1.2.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/MarkBaker/PHPMatrix.git",
+                "reference": "44bb1ab01811116f01fe216ab37d921dccc6c10d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/44bb1ab01811116f01fe216ab37d921dccc6c10d",
+                "reference": "44bb1ab01811116f01fe216ab37d921dccc6c10d",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^5.6.0|^7.0.0"
+            },
+            "require-dev": {
+                "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
+                "phpcompatibility/php-compatibility": "dev-master",
+                "phploc/phploc": "^4",
+                "phpmd/phpmd": "dev-master",
+                "phpunit/phpunit": "^5.7|^6.0|7.0",
+                "sebastian/phpcpd": "^3.0",
+                "squizlabs/php_codesniffer": "^3.0@dev"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "classes/src/Functions/adjoint.php",
+                    "classes/src/Functions/antidiagonal.php",
+                    "classes/src/Functions/cofactors.php",
+                    "classes/src/Functions/determinant.php",
+                    "classes/src/Functions/diagonal.php",
+                    "classes/src/Functions/identity.php",
+                    "classes/src/Functions/inverse.php",
+                    "classes/src/Functions/minors.php",
+                    "classes/src/Functions/trace.php",
+                    "classes/src/Functions/transpose.php",
+                    "classes/src/Operations/add.php",
+                    "classes/src/Operations/directsum.php",
+                    "classes/src/Operations/subtract.php",
+                    "classes/src/Operations/multiply.php",
+                    "classes/src/Operations/divideby.php",
+                    "classes/src/Operations/divideinto.php"
+                ],
+                "psr-4": {
+                    "Matrix\\": "classes/src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mark Baker",
+                    "email": "mark@lange.demon.co.uk"
+                }
+            ],
+            "description": "PHP Class for working with matrices",
+            "homepage": "https://github.com/MarkBaker/PHPMatrix",
+            "keywords": [
+                "mathematics",
+                "matrix",
+                "vector"
+            ],
+            "support": {
+                "issues": "https://github.com/MarkBaker/PHPMatrix/issues",
+                "source": "https://github.com/MarkBaker/PHPMatrix/tree/1.2.3"
+            },
+            "time": "2021-01-26T14:36:01+00:00"
+        },
+        {
+            "name": "monolog/monolog",
+            "version": "2.9.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/monolog.git",
+                "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f",
+                "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2",
+                "psr/log": "^1.0.1 || ^2.0 || ^3.0"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0"
+            },
+            "require-dev": {
+                "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+                "doctrine/couchdb": "~1.0@dev",
+                "elasticsearch/elasticsearch": "^7 || ^8",
+                "ext-json": "*",
+                "graylog2/gelf-php": "^1.4.2 || ^2@dev",
+                "guzzlehttp/guzzle": "^7.4",
+                "guzzlehttp/psr7": "^2.2",
+                "mongodb/mongodb": "^1.8",
+                "php-amqplib/php-amqplib": "~2.4 || ^3",
+                "phpspec/prophecy": "^1.15",
+                "phpstan/phpstan": "^0.12.91",
+                "phpunit/phpunit": "^8.5.14",
+                "predis/predis": "^1.1 || ^2.0",
+                "rollbar/rollbar": "^1.3 || ^2 || ^3",
+                "ruflin/elastica": "^7",
+                "swiftmailer/swiftmailer": "^5.3|^6.0",
+                "symfony/mailer": "^5.4 || ^6",
+                "symfony/mime": "^5.4 || ^6"
+            },
+            "suggest": {
+                "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+                "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+                "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
+                "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+                "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
+                "ext-mbstring": "Allow to work properly with unicode symbols",
+                "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+                "ext-openssl": "Required to send log messages using SSL",
+                "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
+                "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+                "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
+                "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+                "rollbar/rollbar": "Allow sending log messages to Rollbar",
+                "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Monolog\\": "src/Monolog"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "https://seld.be"
+                }
+            ],
+            "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+            "homepage": "https://github.com/Seldaek/monolog",
+            "keywords": [
+                "log",
+                "logging",
+                "psr-3"
+            ],
+            "support": {
+                "issues": "https://github.com/Seldaek/monolog/issues",
+                "source": "https://github.com/Seldaek/monolog/tree/2.9.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/Seldaek",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-10-27T15:25:26+00:00"
+        },
+        {
+            "name": "mtdowling/jmespath.php",
+            "version": "2.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/jmespath/jmespath.php.git",
+                "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b",
+                "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0",
+                "symfony/polyfill-mbstring": "^1.17"
+            },
+            "require-dev": {
+                "composer/xdebug-handler": "^3.0.3",
+                "phpunit/phpunit": "^8.5.33"
+            },
+            "bin": [
+                "bin/jp.php"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/JmesPath.php"
+                ],
+                "psr-4": {
+                    "JmesPath\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Declaratively specify how to extract elements from a JSON document",
+            "keywords": [
+                "json",
+                "jsonpath"
+            ],
+            "support": {
+                "issues": "https://github.com/jmespath/jmespath.php/issues",
+                "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0"
+            },
+            "time": "2023-08-25T10:54:48+00:00"
+        },
+        {
+            "name": "nelexa/zip",
+            "version": "3.3.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Ne-Lexa/php-zip.git",
+                "reference": "501b52f6fc393a599b44ff348a42740e1eaac7c6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Ne-Lexa/php-zip/zipball/501b52f6fc393a599b44ff348a42740e1eaac7c6",
+                "reference": "501b52f6fc393a599b44ff348a42740e1eaac7c6",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-zlib": "*",
+                "paragonie/random_compat": "*",
+                "php": "^5.5.9 || ^7.0",
+                "psr/http-message": "^1.0",
+                "symfony/finder": "^3.0|^4.0|^5.0"
+            },
+            "require-dev": {
+                "ext-bz2": "*",
+                "ext-fileinfo": "*",
+                "ext-openssl": "*",
+                "ext-xml": "*",
+                "guzzlehttp/psr7": "^1.6",
+                "phpunit/phpunit": "^4.8|^5.7",
+                "symfony/var-dumper": "^3.0|^4.0|^5.0"
+            },
+            "suggest": {
+                "ext-bz2": "Needed to support BZIP2 compression",
+                "ext-fileinfo": "Needed to get mime-type file",
+                "ext-mcrypt": "Needed to support encrypt zip entries or use ext-openssl",
+                "ext-openssl": "Needed to support encrypt zip entries or use ext-mcrypt"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "PhpZip\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ne-Lexa",
+                    "email": "alexey@nelexa.ru",
+                    "role": "Developer"
+                }
+            ],
+            "description": "PhpZip is a php-library for extended work with ZIP-archives. Open, create, update, delete, extract and get info tool. Supports appending to existing ZIP files, WinZip AES encryption, Traditional PKWARE Encryption, ZipAlign tool, BZIP2 compression, external file attributes and ZIP64 extensions. Alternative ZipArchive. It does not require php-zip extension.",
+            "homepage": "https://github.com/Ne-Lexa/php-zip",
+            "keywords": [
+                "archive",
+                "extract",
+                "unzip",
+                "winzip",
+                "zip",
+                "zipalign",
+                "ziparchive"
+            ],
+            "support": {
+                "issues": "https://github.com/Ne-Lexa/php-zip/issues",
+                "source": "https://github.com/Ne-Lexa/php-zip/tree/3.3.3"
+            },
+            "time": "2020-07-11T21:01:42+00:00"
+        },
+        {
+            "name": "overtrue/pinyin",
+            "version": "3.0.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/overtrue/pinyin.git",
+                "reference": "3b781d267197b74752daa32814d3a2cf5d140779"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/overtrue/pinyin/zipball/3b781d267197b74752daa32814d3a2cf5d140779",
+                "reference": "3b781d267197b74752daa32814d3a2cf5d140779",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Overtrue\\Pinyin\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Carlos",
+                    "homepage": "http://github.com/overtrue"
+                }
+            ],
+            "description": "Chinese to pinyin translator.",
+            "homepage": "https://github.com/overtrue/pinyin",
+            "keywords": [
+                "Chinese",
+                "Pinyin",
+                "cn2pinyin"
+            ],
+            "support": {
+                "issues": "https://github.com/overtrue/pinyin/issues",
+                "source": "https://github.com/overtrue/pinyin/tree/master"
+            },
+            "time": "2017-07-10T07:20:01+00:00"
+        },
+        {
+            "name": "overtrue/socialite",
+            "version": "2.0.24",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/overtrue/socialite.git",
+                "reference": "ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/overtrue/socialite/zipball/ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec",
+                "reference": "ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/guzzle": "^5.0|^6.0|^7.0",
+                "php": ">=5.6",
+                "symfony/http-foundation": "^2.7|^3.0|^4.0|^5.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "~1.2",
+                "phpunit/phpunit": "^6.0|^7.0|^8.0|^9.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Overtrue\\Socialite\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "overtrue",
+                    "email": "anzhengchao@gmail.com"
+                }
+            ],
+            "description": "A collection of OAuth 2 packages that extracts from laravel/socialite.",
+            "keywords": [
+                "login",
+                "oauth",
+                "qq",
+                "social",
+                "wechat",
+                "weibo"
+            ],
+            "support": {
+                "issues": "https://github.com/overtrue/socialite/issues",
+                "source": "https://github.com/overtrue/socialite/tree/2.0.24"
+            },
+            "funding": [
+                {
+                    "url": "https://www.patreon.com/overtrue",
+                    "type": "patreon"
+                }
+            ],
+            "time": "2021-05-13T16:04:48+00:00"
+        },
+        {
+            "name": "overtrue/wechat",
+            "version": "4.2.11",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/w7corp/easywechat.git",
+                "reference": "853e0772e6aa53a71edf1b5d251c7ff1e6b2a2bf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/w7corp/easywechat/zipball/853e0772e6aa53a71edf1b5d251c7ff1e6b2a2bf",
+                "reference": "853e0772e6aa53a71edf1b5d251c7ff1e6b2a2bf",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "easywechat-composer/easywechat-composer": "^1.1",
+                "ext-fileinfo": "*",
+                "ext-openssl": "*",
+                "ext-simplexml": "*",
+                "guzzlehttp/guzzle": "^6.2",
+                "monolog/monolog": "^1.22 || ^2.0",
+                "overtrue/socialite": "~2.0",
+                "php": ">=7.1",
+                "pimple/pimple": "^3.0",
+                "psr/simple-cache": "^1.0",
+                "symfony/cache": "^3.3 || ^4.3",
+                "symfony/event-dispatcher": "^4.3",
+                "symfony/http-foundation": "^2.7 || ^3.0 || ^4.0",
+                "symfony/psr-http-message-bridge": "^0.3 || ^1.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2.15",
+                "mikey179/vfsstream": "^1.6",
+                "mockery/mockery": "^1.2.3",
+                "phpstan/phpstan": "^0.11.12",
+                "phpunit/phpunit": "^7.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/Kernel/Support/Helpers.php",
+                    "src/Kernel/Helpers.php"
+                ],
+                "psr-4": {
+                    "EasyWeChat\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "overtrue",
+                    "email": "anzhengchao@gmail.com"
+                }
+            ],
+            "description": "微信SDK",
+            "keywords": [
+                "sdk",
+                "wechat",
+                "weixin",
+                "weixin-sdk"
+            ],
+            "support": {
+                "issues": "https://github.com/w7corp/easywechat/issues",
+                "source": "https://github.com/w7corp/easywechat/tree/4.2.11"
+            },
+            "abandoned": "w7corp/easywechat",
+            "time": "2019-11-27T16:38:00+00:00"
+        },
+        {
+            "name": "paragonie/random_compat",
+            "version": "v9.99.100",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/paragonie/random_compat.git",
+                "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
+                "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">= 7"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.*|5.*",
+                "vimeo/psalm": "^1"
+            },
+            "suggest": {
+                "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+            },
+            "type": "library",
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Paragon Initiative Enterprises",
+                    "email": "security@paragonie.com",
+                    "homepage": "https://paragonie.com"
+                }
+            ],
+            "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+            "keywords": [
+                "csprng",
+                "polyfill",
+                "pseudorandom",
+                "random"
+            ],
+            "support": {
+                "email": "info@paragonie.com",
+                "issues": "https://github.com/paragonie/random_compat/issues",
+                "source": "https://github.com/paragonie/random_compat"
+            },
+            "time": "2020-10-15T08:29:30+00:00"
+        },
+        {
+            "name": "phpoffice/phpspreadsheet",
+            "version": "1.12.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
+                "reference": "f79611d6dc1f6b7e8e30b738fc371b392001dbfd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/f79611d6dc1f6b7e8e30b738fc371b392001dbfd",
+                "reference": "f79611d6dc1f6b7e8e30b738fc371b392001dbfd",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-ctype": "*",
+                "ext-dom": "*",
+                "ext-fileinfo": "*",
+                "ext-gd": "*",
+                "ext-iconv": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-simplexml": "*",
+                "ext-xml": "*",
+                "ext-xmlreader": "*",
+                "ext-xmlwriter": "*",
+                "ext-zip": "*",
+                "ext-zlib": "*",
+                "markbaker/complex": "^1.4",
+                "markbaker/matrix": "^1.2",
+                "php": "^7.1",
+                "psr/simple-cache": "^1.0"
+            },
+            "require-dev": {
+                "dompdf/dompdf": "^0.8.3",
+                "friendsofphp/php-cs-fixer": "^2.16",
+                "jpgraph/jpgraph": "^4.0",
+                "mpdf/mpdf": "^8.0",
+                "phpcompatibility/php-compatibility": "^9.3",
+                "phpunit/phpunit": "^7.5",
+                "squizlabs/php_codesniffer": "^3.5",
+                "tecnickcom/tcpdf": "^6.3"
+            },
+            "suggest": {
+                "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+                "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
+                "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
+                "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Maarten Balliauw",
+                    "homepage": "https://blog.maartenballiauw.be"
+                },
+                {
+                    "name": "Mark Baker",
+                    "homepage": "https://markbakeruk.net"
+                },
+                {
+                    "name": "Franck Lefevre",
+                    "homepage": "https://rootslabs.net"
+                },
+                {
+                    "name": "Erik Tilt"
+                },
+                {
+                    "name": "Adrien Crivelli"
+                }
+            ],
+            "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+            "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
+            "keywords": [
+                "OpenXML",
+                "excel",
+                "gnumeric",
+                "ods",
+                "php",
+                "spreadsheet",
+                "xls",
+                "xlsx"
+            ],
+            "support": {
+                "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
+                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.12.0"
+            },
+            "time": "2020-04-27T08:12:48+00:00"
+        },
+        {
+            "name": "pimple/pimple",
+            "version": "v3.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/silexphp/Pimple.git",
+                "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
+                "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/container": "^1.1 || ^2.0"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "^5.4@dev"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.4.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Pimple": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Pimple, a simple Dependency Injection Container",
+            "homepage": "https://pimple.symfony.com",
+            "keywords": [
+                "container",
+                "dependency injection"
+            ],
+            "support": {
+                "source": "https://github.com/silexphp/Pimple/tree/v3.5.0"
+            },
+            "time": "2021-10-28T11:13:42+00:00"
+        },
+        {
+            "name": "psr/cache",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/cache.git",
+                "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
+                "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Cache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for caching libraries",
+            "keywords": [
+                "cache",
+                "psr",
+                "psr-6"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/cache/tree/master"
+            },
+            "time": "2016-08-06T20:24:11+00:00"
+        },
+        {
+            "name": "psr/container",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/container.git",
+                "reference": "2ae37329ee82f91efadc282cc2d527fd6065a5ef"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/2ae37329ee82f91efadc282cc2d527fd6065a5ef",
+                "reference": "2ae37329ee82f91efadc282cc2d527fd6065a5ef",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Container\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common Container Interface (PHP FIG PSR-11)",
+            "homepage": "https://github.com/php-fig/container",
+            "keywords": [
+                "PSR-11",
+                "container",
+                "container-interface",
+                "container-interop",
+                "psr"
+            ],
+            "support": {
+                "issues": "https://github.com/php-fig/container/issues",
+                "source": "https://github.com/php-fig/container/tree/2.0.1"
+            },
+            "time": "2021-03-24T13:40:57+00:00"
+        },
+        {
+            "name": "psr/http-message",
+            "version": "1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message.git",
+                "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+                "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP messages",
+            "homepage": "https://github.com/php-fig/http-message",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-message/tree/1.1"
+            },
+            "time": "2023-04-04T09:50:52+00:00"
+        },
+        {
+            "name": "psr/log",
+            "version": "1.1.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
+                "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "Psr/Log/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/log/tree/1.1.4"
+            },
+            "time": "2021-05-03T11:20:27+00:00"
+        },
+        {
+            "name": "psr/simple-cache",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/simple-cache.git",
+                "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+                "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\SimpleCache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interfaces for simple caching",
+            "keywords": [
+                "cache",
+                "caching",
+                "psr",
+                "psr-16",
+                "simple-cache"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/simple-cache/tree/master"
+            },
+            "time": "2017-10-23T01:57:42+00:00"
+        },
+        {
+            "name": "ralouphie/getallheaders",
+            "version": "3.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ralouphie/getallheaders.git",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2.1",
+                "phpunit/phpunit": "^5 || ^6.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/getallheaders.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ralph Khattar",
+                    "email": "ralph.khattar@gmail.com"
+                }
+            ],
+            "description": "A polyfill for getallheaders.",
+            "support": {
+                "issues": "https://github.com/ralouphie/getallheaders/issues",
+                "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+            },
+            "time": "2019-03-08T08:55:37+00:00"
+        },
+        {
+            "name": "symfony/cache",
+            "version": "v4.4.48",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/cache.git",
+                "reference": "3b98ed664887ad197b8ede3da2432787212eb915"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/cache/zipball/3b98ed664887ad197b8ede3da2432787212eb915",
+                "reference": "3b98ed664887ad197b8ede3da2432787212eb915",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "psr/cache": "^1.0|^2.0",
+                "psr/log": "^1|^2|^3",
+                "symfony/cache-contracts": "^1.1.7|^2",
+                "symfony/polyfill-php73": "^1.9",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/service-contracts": "^1.1|^2",
+                "symfony/var-exporter": "^4.2|^5.0"
+            },
+            "conflict": {
+                "doctrine/dbal": "<2.7",
+                "symfony/dependency-injection": "<3.4",
+                "symfony/http-kernel": "<4.4|>=5.0",
+                "symfony/var-dumper": "<4.4"
+            },
+            "provide": {
+                "psr/cache-implementation": "1.0|2.0",
+                "psr/simple-cache-implementation": "1.0|2.0",
+                "symfony/cache-implementation": "1.0|2.0"
+            },
+            "require-dev": {
+                "cache/integration-tests": "dev-master",
+                "doctrine/cache": "^1.6|^2.0",
+                "doctrine/dbal": "^2.7|^3.0",
+                "predis/predis": "^1.1",
+                "psr/simple-cache": "^1.0|^2.0",
+                "symfony/config": "^4.2|^5.0",
+                "symfony/dependency-injection": "^3.4|^4.1|^5.0",
+                "symfony/filesystem": "^4.4|^5.0",
+                "symfony/http-kernel": "^4.4",
+                "symfony/var-dumper": "^4.4|^5.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Cache\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides extended PSR-6, PSR-16 (and tags) implementations",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "caching",
+                "psr6"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/cache/tree/v4.4.48"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-10-17T20:21:54+00:00"
+        },
+        {
+            "name": "symfony/cache-contracts",
+            "version": "v2.5.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/cache-contracts.git",
+                "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
+                "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/cache": "^1.0|^2.0|^3.0"
+            },
+            "suggest": {
+                "symfony/cache-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.5-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Cache\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to caching",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-01-02T09:53:40+00:00"
+        },
+        {
+            "name": "symfony/deprecation-contracts",
+            "version": "v2.5.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/deprecation-contracts.git",
+                "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
+                "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.5-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "function.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "A generic function and convention to trigger deprecation notices",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-01-02T09:53:40+00:00"
+        },
+        {
+            "name": "symfony/event-dispatcher",
+            "version": "v4.4.44",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher.git",
+                "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1e866e9e5c1b22168e0ce5f0b467f19bba61266a",
+                "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/event-dispatcher-contracts": "^1.1",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<3.4"
+            },
+            "provide": {
+                "psr/event-dispatcher-implementation": "1.0",
+                "symfony/event-dispatcher-implementation": "1.1"
+            },
+            "require-dev": {
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^3.4|^4.0|^5.0",
+                "symfony/dependency-injection": "^3.4|^4.0|^5.0",
+                "symfony/error-handler": "~3.4|~4.4",
+                "symfony/expression-language": "^3.4|^4.0|^5.0",
+                "symfony/http-foundation": "^3.4|^4.0|^5.0",
+                "symfony/service-contracts": "^1.1|^2",
+                "symfony/stopwatch": "^3.4|^4.0|^5.0"
+            },
+            "suggest": {
+                "symfony/dependency-injection": "",
+                "symfony/http-kernel": ""
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\EventDispatcher\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.44"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-07-20T09:59:04+00:00"
+        },
+        {
+            "name": "symfony/event-dispatcher-contracts",
+            "version": "v1.10.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+                "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/761c8b8387cfe5f8026594a75fdf0a4e83ba6974",
+                "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1.3"
+            },
+            "suggest": {
+                "psr/event-dispatcher": "",
+                "symfony/event-dispatcher-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.1-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\EventDispatcher\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to dispatching event",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.10.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-07-20T09:59:04+00:00"
+        },
+        {
+            "name": "symfony/finder",
+            "version": "v5.4.27",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/finder.git",
+                "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d",
+                "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Finder\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Finds files and directories via an intuitive fluent interface",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/finder/tree/v5.4.27"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-07-31T08:02:31+00:00"
+        },
+        {
+            "name": "symfony/http-foundation",
+            "version": "v4.4.49",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-foundation.git",
+                "reference": "191413c7b832c015bb38eae963f2e57498c3c173"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/191413c7b832c015bb38eae963f2e57498c3c173",
+                "reference": "191413c7b832c015bb38eae963f2e57498c3c173",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/mime": "^4.3|^5.0",
+                "symfony/polyfill-mbstring": "~1.1",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "require-dev": {
+                "predis/predis": "~1.0",
+                "symfony/expression-language": "^3.4|^4.0|^5.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\HttpFoundation\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Defines an object-oriented layer for the HTTP specification",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/http-foundation/tree/v4.4.49"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-11-04T16:17:57+00:00"
+        },
+        {
+            "name": "symfony/mime",
+            "version": "v5.4.26",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/mime.git",
+                "reference": "2ea06dfeee20000a319d8407cea1d47533d5a9d2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/2ea06dfeee20000a319d8407cea1d47533d5a9d2",
+                "reference": "2ea06dfeee20000a319d8407cea1d47533d5a9d2",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/polyfill-intl-idn": "^1.10",
+                "symfony/polyfill-mbstring": "^1.0",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "conflict": {
+                "egulias/email-validator": "~3.0.0",
+                "phpdocumentor/reflection-docblock": "<3.2.2",
+                "phpdocumentor/type-resolver": "<1.4.0",
+                "symfony/mailer": "<4.4",
+                "symfony/serializer": "<5.4.26|>=6,<6.2.13|>=6.3,<6.3.2"
+            },
+            "require-dev": {
+                "egulias/email-validator": "^2.1.10|^3.1|^4",
+                "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+                "symfony/property-access": "^4.4|^5.1|^6.0",
+                "symfony/property-info": "^4.4|^5.1|^6.0",
+                "symfony/serializer": "^5.4.26|~6.2.13|^6.3.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Mime\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Allows manipulating MIME messages",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "mime",
+                "mime-type"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/mime/tree/v5.4.26"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-07-27T06:29:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-idn",
+            "version": "v1.28.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-idn.git",
+                "reference": "ecaafce9f77234a6a449d29e49267ba10499116d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d",
+                "reference": "ecaafce9f77234a6a449d29e49267ba10499116d",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1",
+                "symfony/polyfill-intl-normalizer": "^1.10",
+                "symfony/polyfill-php72": "^1.10"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.28-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Idn\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Laurent Bassin",
+                    "email": "laurent@bassin.info"
+                },
+                {
+                    "name": "Trevor Rowbotham",
+                    "email": "trevor.rowbotham@pm.me"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "idn",
+                "intl",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-01-26T09:30:37+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-normalizer",
+            "version": "v1.28.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.28-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's Normalizer class and related functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "intl",
+                "normalizer",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-01-26T09:26:14+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.28.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "42292d99c55abe617799667f454222c54c60e229"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
+                "reference": "42292d99c55abe617799667f454222c54c60e229",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-mbstring": "*"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.28-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-07-28T09:04:16+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php72",
+            "version": "v1.28.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php72.git",
+                "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179",
+                "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.28-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php72\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-01-26T09:26:14+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php73",
+            "version": "v1.28.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php73.git",
+                "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5",
+                "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.28-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php73\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-01-26T09:26:14+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php80",
+            "version": "v1.28.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php80.git",
+                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.28-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php80\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ion Bazan",
+                    "email": "ion.bazan@gmail.com"
+                },
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-01-26T09:26:14+00:00"
+        },
+        {
+            "name": "symfony/psr-http-message-bridge",
+            "version": "v1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/psr-http-message-bridge.git",
+                "reference": "9d3e80d54d9ae747ad573cad796e8e247df7b796"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/9d3e80d54d9ae747ad573cad796e8e247df7b796",
+                "reference": "9d3e80d54d9ae747ad573cad796e8e247df7b796",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1",
+                "psr/http-message": "^1.0",
+                "symfony/http-foundation": "^4.4 || ^5.0"
+            },
+            "require-dev": {
+                "nyholm/psr7": "^1.1",
+                "symfony/phpunit-bridge": "^4.4 || ^5.0",
+                "zendframework/zend-diactoros": "^1.4.1 || ^2.0"
+            },
+            "suggest": {
+                "nyholm/psr7": "For a super lightweight PSR-7/17 implementation"
+            },
+            "type": "symfony-bridge",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bridge\\PsrHttpMessage\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                }
+            ],
+            "description": "PSR HTTP message bridge",
+            "homepage": "http://symfony.com",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr-17",
+                "psr-7"
+            ],
+            "support": {
+                "issues": "https://github.com/symfony/psr-http-message-bridge/issues",
+                "source": "https://github.com/symfony/psr-http-message-bridge/tree/master"
+            },
+            "time": "2019-11-25T19:33:50+00:00"
+        },
+        {
+            "name": "symfony/service-contracts",
+            "version": "v1.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/service-contracts.git",
+                "reference": "191afdcb5804db960d26d8566b7e9a2843cab3a0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/191afdcb5804db960d26d8566b7e9a2843cab3a0",
+                "reference": "191afdcb5804db960d26d8566b7e9a2843cab3a0",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1.3"
+            },
+            "suggest": {
+                "psr/container": "",
+                "symfony/service-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Service\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to writing services",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/service-contracts/tree/v1.1.2"
+            },
+            "time": "2019-05-28T07:50:59+00:00"
+        },
+        {
+            "name": "symfony/var-exporter",
+            "version": "v4.4.43",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-exporter.git",
+                "reference": "4a7a3a3d55c471d396e6d28011368b7b83cb518b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-exporter/zipball/4a7a3a3d55c471d396e6d28011368b7b83cb518b",
+                "reference": "4a7a3a3d55c471d396e6d28011368b7b83cb518b",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "require-dev": {
+                "symfony/var-dumper": "^4.4.9|^5.0.9"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\VarExporter\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Allows exporting any serializable PHP data structure to plain PHP code",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "clone",
+                "construct",
+                "export",
+                "hydrate",
+                "instantiate",
+                "serialize"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/var-exporter/tree/v4.4.43"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-27T11:44:32+00:00"
+        },
+        {
+            "name": "topthink/framework",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://gitee.com/fastadminnet/framework.git",
+                "reference": "988c95b7ba21138ecab30f600bf2ec9050f49a5e"
+            },
+            "require": {
+                "php": ">=7.1.0",
+                "topthink/think-installer": "~1.0"
+            },
+            "require-dev": {
+                "johnkary/phpunit-speedtrap": "^1.0",
+                "mikey179/vfsstream": "~1.6",
+                "phpdocumentor/reflection-docblock": "^2.0",
+                "phploc/phploc": "2.*",
+                "phpunit/phpunit": "4.8.*",
+                "sebastian/phpcpd": "2.*"
+            },
+            "default-branch": true,
+            "type": "think-framework",
+            "autoload": {
+                "psr-4": {
+                    "think\\": "library/think"
+                }
+            },
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                }
+            ],
+            "description": "the new thinkphp framework",
+            "homepage": "http://thinkphp.cn/",
+            "keywords": [
+                "ORM",
+                "framework",
+                "thinkphp"
+            ],
+            "time": "2023-12-14T10:19:34+00:00"
+        },
+        {
+            "name": "topthink/think-captcha",
+            "version": "v1.0.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-captcha.git",
+                "reference": "0c55455df26a1626a60d0dc35d2d89002b741d44"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-captcha/zipball/0c55455df26a1626a60d0dc35d2d89002b741d44",
+                "reference": "0c55455df26a1626a60d0dc35d2d89002b741d44",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/helper.php"
+                ],
+                "psr-4": {
+                    "think\\captcha\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
+                }
+            ],
+            "description": "captcha package for thinkphp5",
+            "support": {
+                "issues": "https://github.com/top-think/think-captcha/issues",
+                "source": "https://github.com/top-think/think-captcha/tree/master"
+            },
+            "time": "2016-07-06T01:47:11+00:00"
+        },
+        {
+            "name": "topthink/think-helper",
+            "version": "v1.0.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-helper.git",
+                "reference": "5f92178606c8ce131d36b37a57c58eb71e55f019"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-helper/zipball/5f92178606c8ce131d36b37a57c58eb71e55f019",
+                "reference": "5f92178606c8ce131d36b37a57c58eb71e55f019",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/helper.php"
+                ],
+                "psr-4": {
+                    "think\\helper\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
+                }
+            ],
+            "description": "The ThinkPHP5 Helper Package",
+            "support": {
+                "issues": "https://github.com/top-think/think-helper/issues",
+                "source": "https://github.com/top-think/think-helper/tree/master"
+            },
+            "time": "2018-10-05T00:43:21+00:00"
+        },
+        {
+            "name": "topthink/think-installer",
+            "version": "v1.0.14",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-installer.git",
+                "reference": "eae1740ac264a55c06134b6685dfb9f837d004d1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-installer/zipball/eae1740ac264a55c06134b6685dfb9f837d004d1",
+                "reference": "eae1740ac264a55c06134b6685dfb9f837d004d1",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "composer-plugin-api": "^1.0||^2.0"
+            },
+            "require-dev": {
+                "composer/composer": "^1.0||^2.0"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "think\\composer\\Plugin"
+            },
+            "autoload": {
+                "psr-4": {
+                    "think\\composer\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
+                }
+            ],
+            "support": {
+                "issues": "https://github.com/top-think/think-installer/issues",
+                "source": "https://github.com/top-think/think-installer/tree/v1.0.14"
+            },
+            "time": "2021-03-25T08:34:02+00:00"
+        },
+        {
+            "name": "topthink/think-queue",
+            "version": "v1.1.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-queue.git",
+                "reference": "250650eb0e8ea5af4cfdc7ae46f3f4e0a24ac245"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-queue/zipball/250650eb0e8ea5af4cfdc7ae46f3f4e0a24ac245",
+                "reference": "250650eb0e8ea5af4cfdc7ae46f3f4e0a24ac245",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "topthink/think-helper": ">=1.0.4",
+                "topthink/think-installer": ">=1.0.10"
+            },
+            "require-dev": {
+                "topthink/framework": "~5.0.0"
+            },
+            "type": "think-extend",
+            "extra": {
+                "think-config": {
+                    "queue": "src/config.php"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/common.php"
+                ],
+                "psr-4": {
+                    "think\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
+                }
+            ],
+            "description": "The ThinkPHP5 Queue Package",
+            "support": {
+                "issues": "https://github.com/top-think/think-queue/issues",
+                "source": "https://github.com/top-think/think-queue/tree/master"
+            },
+            "time": "2018-10-15T10:16:55+00:00"
+        },
+        {
+            "name": "txthinking/mailer",
+            "version": "v2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/txthinking/Mailer.git",
+                "reference": "09013cf9dad3aac195f66ae5309e8c3343c018e9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/txthinking/Mailer/zipball/09013cf9dad3aac195f66ae5309e8c3343c018e9",
+                "reference": "09013cf9dad3aac195f66ae5309e8c3343c018e9",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.2",
+                "psr/log": "~1.0"
+            },
+            "require-dev": {
+                "monolog/monolog": "~1.13",
+                "phpunit/phpunit": "~4.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Tx\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Cloud",
+                    "email": "cloud@txthinking.com",
+                    "homepage": "http://www.txthinking.com",
+                    "role": "Thinker"
+                },
+                {
+                    "name": "Matt Sowers",
+                    "email": "msowers@erblearn.org"
+                }
+            ],
+            "description": "A very lightweight PHP SMTP mail sender",
+            "homepage": "http://github.com/txthinking/Mailer",
+            "keywords": [
+                "mail",
+                "smtp"
+            ],
+            "support": {
+                "issues": "https://github.com/txthinking/Mailer/issues",
+                "source": "https://github.com/txthinking/Mailer/tree/master"
+            },
+            "time": "2018-10-09T10:47:23+00:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": {
+        "topthink/framework": 20
+    },
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=7.1.0",
+        "ext-json": "*",
+        "ext-curl": "*",
+        "ext-pdo": "*",
+        "ext-bcmath": "*"
+    },
+    "platform-dev": [],
+    "plugin-api-version": "2.1.0"
+}

+ 1 - 1
thinkphp/base.php

@@ -9,7 +9,7 @@
 // | Author: liu21st <liu21st@gmail.com>
 // +----------------------------------------------------------------------
 
-define('THINK_VERSION', '5.0.24');
+define('THINK_VERSION', '5.0.25');
 define('THINK_START_TIME', microtime(true));
 define('THINK_START_MEM', memory_get_usage());
 define('EXT', '.php');

+ 3 - 3
thinkphp/library/think/App.php

@@ -400,10 +400,10 @@ class App
     private static function getParamValue($param, &$vars, $type)
     {
         $name  = $param->getName();
-        $class = $param->getClass();
+        $reflectionType = $param->getType();
 
-        if ($class) {
-            $className = $class->getName();
+        if ($reflectionType && $reflectionType->isBuiltin() === false) {
+            $className = $reflectionType->getName();
             $bind      = Request::instance()->$name;
 
             if ($bind instanceof $className) {

+ 7 - 1
thinkphp/library/think/Lang.php

@@ -201,7 +201,7 @@ class Lang
         } elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
             // 自动侦测浏览器语言
             preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
-            $langSet     = strtolower($matches[1]);
+            $langSet     = strtolower($matches[1] ?? '');
             $acceptLangs = Config::get('header_accept_lang');
 
             if (isset($acceptLangs[$langSet])) {
@@ -211,6 +211,12 @@ class Lang
             }
         }
 
+        if (preg_match('/^([a-z0-9\-_]{2,10})$/i', $langSet, $matches)) {
+            $langSet = strtolower($matches[1]);
+        } else {
+            $langSet = self::$range;
+        }
+
         // 合法的语言
         if (empty(self::$allowLangList) || in_array($langSet, self::$allowLangList)) {
             self::$range = $langSet ?: self::$range;

+ 2 - 2
thinkphp/library/think/Model.php

@@ -1309,10 +1309,10 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
     }
 
     /**
-     * 字段值(延迟)增长
+     * 字段值(延迟)减少
      * @access public
      * @param string  $field    字段名
-     * @param integer $step     增长
+     * @param integer $step     减少
      * @param integer $lazyTime 延时时间(s)
      * @return integer|true
      * @throws Exception

+ 1 - 1
vendor/autoload.php

@@ -2,6 +2,6 @@
 
 // autoload.php @generated by Composer
 
-require_once __DIR__ . '/composer' . '/autoload_real.php';
+require_once __DIR__ . '/composer/autoload_real.php';
 
 return ComposerAutoloaderInit73f9e72fede2c36621e52f7b610bbb65::getLoader();

+ 4 - 0
vendor/aws/aws-crt-php/CODE_OF_CONDUCT.md

@@ -0,0 +1,4 @@
+## Code of Conduct
+This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct).
+For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact
+opensource-codeofconduct@amazon.com with any additional questions or comments.

+ 175 - 0
vendor/aws/aws-crt-php/LICENSE

@@ -0,0 +1,175 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.

+ 1 - 0
vendor/aws/aws-crt-php/NOTICE

@@ -0,0 +1 @@
+Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.

+ 117 - 0
vendor/aws/aws-crt-php/README.md

@@ -0,0 +1,117 @@
+# AWS Common Runtime PHP bindings
+
+## Requirements
+
+* PHP 5.5+ on UNIX platforms, 7.2+ on Windows
+* CMake 3.x
+* GCC 4.4+, clang 3.8+ on UNIX, Visual Studio build tools on Windows
+* Tests require [Composer](https://getcomposer.org)
+
+## Installing with Composer and PECL
+
+The package has two different package published to [composer](https://packagist.org/packages/aws/aws-crt-php) and [PECL](https://pecl.php.net/package/awscrt).
+
+On UNIX, you can get the package from package manager or build from source:
+
+```
+pecl install awscrt
+composer require aws/aws-crt-php
+```
+
+On Windows, you need to build from source as instruction written below for the native extension `php_awscrt.dll` . And, follow https://www.php.net/manual/en/install.pecl.windows.php#install.pecl.windows.loading to load extension. After that:
+
+```
+composer require aws/aws-crt-php
+```
+
+## Building from Github source
+
+```sh
+$ git clone --recursive https://github.com/awslabs/aws-crt-php.git
+$ cd aws-crt-php
+$ phpize
+$ ./configure
+$ make
+$ ./dev-scripts/run_tests.sh
+```
+
+## Building on Windows
+
+### Requirements for Windows
+
+* Ensure you have the [windows PHP SDK](https://github.com/microsoft/php-sdk-binary-tools) (this example assumes installation of the SDK to C:\php-sdk and that you've checked out the PHP source to php-src within the build directory) and it works well on your machine.
+
+* Ensure you have "Development package (SDK to develop PHP extensions)" and PHP available from your system path. You can download them from https://windows.php.net/download/. You can check if they are available by running `phpize -v` and `php -v`
+
+### Instructions
+
+From Command Prompt (not powershell). The instruction is based on Visual Studio 2019 on 64bit Windows.
+
+```bat
+> git clone --recursive https://github.com/awslabs/aws-crt-php.git
+> git clone https://github.com/microsoft/php-sdk-binary-tools.git C:\php-sdk
+> C:\php-sdk\phpsdk-vs16-x64.bat
+
+C:\php-sdk\
+$ cd <your-path-to-aws-crt-php>
+
+<your-path-to-aws-crt-php>\
+$ phpize
+
+# --with-prefix only required when your php runtime in system path is different than the runtime you wish to use.
+<your-path-to-aws-crt-php>\
+$ configure --enable-awscrt=shared --with-prefix=<your-path-to-php-prefix>
+
+<your-path-to-aws-crt-php>\
+$ nmake
+
+<your-path-to-aws-crt-php>\
+$ nmake generate-php-ini
+
+# check .\php-win.ini, it now has the full path to php_awscrt.dll that you can manually load to your php runtime, or you can run the following command to run tests and load the required native extension for awscrt.
+<your-path-to-aws-crt-php>\
+$ .\dev-scripts\run_tests.bat <your-path-to-php-binary>
+```
+
+Note: for VS2017, Cmake will default to build for Win32, refer to [here](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2015%202017.html). If you are building for x64 php, you can set environment variable as follow to let cmake pick x64 compiler.
+
+```bat
+set CMAKE_GENERATOR=Visual Studio 15 2017
+set CMAKE_GENERATOR_PLATFORM=x64
+```
+
+## Debugging
+
+Using [PHPBrew](https://github.com/phpbrew/phpbrew) to build/manage multiple versions of PHP is helpful.
+
+Note: You must use a debug build of PHP to debug native extensions.
+See the [PHP Internals Book](https://www.phpinternalsbook.com/php7/build_system/building_php.html) for more info
+
+```shell
+# PHP 8 example
+$ phpbrew install --stdout -j 8 8.0 +default -- CFLAGS=-Wno-error --disable-cgi --enable-debug
+# PHP 5.5 example
+$ phpbrew install --stdout -j 8 5.5 +default -openssl -mbstring -- CFLAGS="-w -Wno-error" --enable-debug --with-zlib=/usr/local/opt/zlib
+$ phpbrew switch php-8.0.6 # or whatever version is current, it'll be at the end of the build output
+$ phpize
+$ ./configure
+$ make CMAKE_BUILD_TYPE=Debug
+```
+
+Ensure that the php you launch from your debugger is the result of `which php` , not just
+the system default php.
+
+## Security
+
+See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information.
+
+## Known OpenSSL related issue (Unix only)
+
+* When your php loads a different version of openssl than your system openssl version, awscrt may fail to load or weirdly crash. You can find the openssl version php linked via: `php -i | grep 'OpenSSL'`, and awscrt linked from the build log, which will be `Found OpenSSL: * (found version *)`
+
+The easiest workaround to those issue is to build from source and get aws-lc for awscrt to depend on instead.
+TO do that, same instructions as [here](#building-from-github-source), but use `USE_OPENSSL=OFF make` instead of `make`
+
+## License
+
+This project is licensed under the Apache-2.0 License.

+ 35 - 0
vendor/aws/aws-crt-php/composer.json

@@ -0,0 +1,35 @@
+{
+    "name": "aws/aws-crt-php",
+    "homepage": "https://github.com/awslabs/aws-crt-php",
+    "description": "AWS Common Runtime for PHP",
+    "keywords": ["aws","amazon","sdk","crt"],
+    "type": "library",
+    "authors": [
+        {
+            "name": "AWS SDK Common Runtime Team",
+            "email": "aws-sdk-common-runtime@amazon.com"
+        }
+    ],
+    "minimum-stability": "alpha",
+    "require": {
+        "php": ">=5.5"
+    },
+    "require-dev": {
+        "phpunit/phpunit":"^4.8.35||^5.6.3||^9.5",
+        "yoast/phpunit-polyfills": "^1.0"
+    },
+    "autoload": {
+        "classmap": [
+            "src/"
+        ]
+    },
+    "suggest": {
+        "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality."
+    },
+    "scripts": {
+        "test": "./dev-scripts/run_tests.sh",
+        "test-extension": "@test",
+        "test-win": ".\\dev-scripts\\run_tests.bat"
+    },
+    "license": "Apache-2.0"
+}

+ 69 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Auth/AwsCredentials.php

@@ -0,0 +1,69 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\Auth;
+
+use AWS\CRT\NativeResource as NativeResource;
+use AWS\CRT\Options as Options;
+
+/**
+ * Represents a set of AWS credentials
+ *
+ * @param array options:
+ * - string access_key_id - AWS Access Key Id
+ * - string secret_access_key - AWS Secret Access Key
+ * - string session_token - Optional STS session token
+ * - int expiration_timepoint_seconds - Optional time to expire these credentials
+ */
+final class AwsCredentials extends NativeResource {
+
+    static function defaults() {
+        return [
+            'access_key_id' => '',
+            'secret_access_key' => '',
+            'session_token' => '',
+            'expiration_timepoint_seconds' => 0,
+        ];
+    }
+
+    private $access_key_id;
+    private $secret_access_key;
+    private $session_token;
+    private $expiration_timepoint_seconds = 0;
+
+    public function __get($name) {
+        return $this->$name;
+    }
+
+    function __construct(array $options = []) {
+        parent::__construct();
+
+        $options = new Options($options, self::defaults());
+        $this->access_key_id = $options->access_key_id->asString();
+        $this->secret_access_key = $options->secret_access_key->asString();
+        $this->session_token = $options->session_token ? $options->session_token->asString() : null;
+        $this->expiration_timepoint_seconds = $options->expiration_timepoint_seconds->asInt();
+
+        if (strlen($this->access_key_id) == 0) {
+            throw new \InvalidArgumentException("access_key_id must be provided");
+        }
+        if (strlen($this->secret_access_key) == 0) {
+            throw new \InvalidArgumentException("secret_access_key must be provided");
+        }
+
+        $creds_options = self::$crt->aws_credentials_options_new();
+        self::$crt->aws_credentials_options_set_access_key_id($creds_options, $this->access_key_id);
+        self::$crt->aws_credentials_options_set_secret_access_key($creds_options, $this->secret_access_key);
+        self::$crt->aws_credentials_options_set_session_token($creds_options, $this->session_token);
+        self::$crt->aws_credentials_options_set_expiration_timepoint_seconds($creds_options, $this->expiration_timepoint_seconds);
+        $this->acquire(self::$crt->aws_credentials_new($creds_options));
+        self::$crt->aws_credentials_options_release($creds_options);
+    }
+
+    function __destruct() {
+        self::$crt->aws_credentials_release($this->release());
+        parent::__destruct();
+    }
+}

+ 23 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Auth/CredentialsProvider.php

@@ -0,0 +1,23 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\Auth;
+
+use AWS\CRT\NativeResource as NativeResource;
+
+/**
+ * Base class for credentials providers
+ */
+abstract class CredentialsProvider extends NativeResource {
+
+    function __construct(array $options = []) {
+        parent::__construct();
+    }
+
+    function __destruct() {
+        self::$crt->credentials_provider_release($this->release());
+        parent::__destruct();
+    }
+}

+ 43 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Auth/Signable.php

@@ -0,0 +1,43 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\Auth;
+
+use AWS\CRT\IO\InputStream;
+use AWS\CRT\NativeResource as NativeResource;
+
+class Signable extends NativeResource {
+
+    public static function fromHttpRequest($http_message) {
+        return new Signable(function() use ($http_message) {
+            return self::$crt->signable_new_from_http_request($http_message->native);
+        });
+    }
+
+    public static function fromChunk($chunk_stream, $previous_signature="") {
+        if (!($chunk_stream instanceof InputStream)) {
+            $chunk_stream = new InputStream($chunk_stream);
+        }
+        return new Signable(function() use($chunk_stream, $previous_signature) {
+            return self::$crt->signable_new_from_chunk($chunk_stream->native, $previous_signature);
+        });
+    }
+
+    public static function fromCanonicalRequest($canonical_request) {
+        return new Signable(function() use($canonical_request) {
+            return self::$crt->signable_new_from_canonical_request($canonical_request);
+        });
+    }
+
+    protected function __construct($ctor) {
+        parent::__construct();
+        $this->acquire($ctor());
+    }
+
+    function __destruct() {
+        self::$crt->signable_release($this->release());
+        parent::__destruct();
+    }
+}

+ 15 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SignatureType.php

@@ -0,0 +1,15 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\Auth;
+
+class SignatureType {
+    const HTTP_REQUEST_HEADERS = 0;
+    const HTTP_REQUEST_QUERY_PARAMS = 1;
+    const HTTP_REQUEST_CHUNK = 2;
+    const HTTP_REQUEST_EVENT = 3;
+    const CANONICAL_REQUEST_HEADERS = 4;
+    const CANONICAL_REQUEST_QUERY_PARAMS = 5;
+}

+ 11 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SignedBodyHeaderType.php

@@ -0,0 +1,11 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\Auth;
+
+class SignedBodyHeaderType {
+    const NONE = 0;
+    const X_AMZ_CONTENT_SHA256 = 1;
+}

+ 22 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Auth/Signing.php

@@ -0,0 +1,22 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\Auth;
+
+use AWS\CRT\NativeResource;
+
+abstract class Signing extends NativeResource {
+    static function signRequestAws($signable, $signing_config, $on_complete) {
+        return self::$crt->sign_request_aws($signable->native, $signing_config->native,
+            function($result, $error_code) use ($on_complete) {
+                $signing_result = SigningResult::fromNative($result);
+                $on_complete($signing_result, $error_code);
+            }, null);
+    }
+
+    static function testVerifySigV4ASigning($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y) {
+        return self::$crt->test_verify_sigv4a_signing($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y);
+    }
+}

+ 11 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningAlgorithm.php

@@ -0,0 +1,11 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\Auth;
+
+class SigningAlgorithm {
+    const SIGv4 = 0;
+    const SIGv4_ASYMMETRIC = 1;
+}

+ 75 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningConfigAWS.php

@@ -0,0 +1,75 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\Auth;
+
+use AWS\CRT\NativeResource as NativeResource;
+use AWS\CRT\Options as Options;
+
+class SigningConfigAWS extends NativeResource {
+
+    public static function defaults() {
+        return [
+            'algorithm' => SigningAlgorithm::SIGv4,
+            'signature_type' => SignatureType::HTTP_REQUEST_HEADERS,
+            'credentials_provider' => null,
+            'region' => null,
+            'service' => null,
+            'use_double_uri_encode' => false,
+            'should_normalize_uri_path' => false,
+            'omit_session_token' => false,
+            'signed_body_value' => null,
+            'signed_body_header_type' => SignedBodyHeaderType::NONE,
+            'expiration_in_seconds' => 0,
+            'date' => time(),
+            'should_sign_header' => null,
+        ];
+    }
+
+    private $options;
+
+    public function __construct(array $options = []) {
+        parent::__construct();
+        $this->options = $options = new Options($options, self::defaults());
+        $sc = $this->acquire(self::$crt->signing_config_aws_new());
+        self::$crt->signing_config_aws_set_algorithm($sc, $options->algorithm->asInt());
+        self::$crt->signing_config_aws_set_signature_type($sc, $options->signature_type->asInt());
+        if ($credentials_provider = $options->credentials_provider->asObject()) {
+            self::$crt->signing_config_aws_set_credentials_provider(
+                $sc,
+                $credentials_provider->native);
+        }
+        self::$crt->signing_config_aws_set_region(
+            $sc, $options->region->asString());
+        self::$crt->signing_config_aws_set_service(
+            $sc, $options->service->asString());
+        self::$crt->signing_config_aws_set_use_double_uri_encode(
+            $sc, $options->use_double_uri_encode->asBool());
+        self::$crt->signing_config_aws_set_should_normalize_uri_path(
+            $sc, $options->should_normalize_uri_path->asBool());
+        self::$crt->signing_config_aws_set_omit_session_token(
+            $sc, $options->omit_session_token->asBool());
+        self::$crt->signing_config_aws_set_signed_body_value(
+            $sc, $options->signed_body_value->asString());
+        self::$crt->signing_config_aws_set_signed_body_header_type(
+            $sc, $options->signed_body_header_type->asInt());
+        self::$crt->signing_config_aws_set_expiration_in_seconds(
+            $sc, $options->expiration_in_seconds->asInt());
+        self::$crt->signing_config_aws_set_date($sc, $options->date->asInt());
+        if ($should_sign_header = $options->should_sign_header->asCallable()) {
+            self::$crt->signing_config_aws_set_should_sign_header_fn($sc, $should_sign_header);
+        }
+    }
+
+    function __destruct()
+    {
+        self::$crt->signing_config_aws_release($this->release());
+        parent::__destruct();
+    }
+
+    public function __get($name) {
+        return $this->options->get($name);
+    }
+}

+ 33 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningResult.php

@@ -0,0 +1,33 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\Auth;
+
+use AWS\CRT\NativeResource;
+use AWS\CRT\HTTP\Request;
+
+class SigningResult extends NativeResource {
+    protected function __construct($native) {
+        parent::__construct();
+
+        $this->acquire($native);
+    }
+
+    function __destruct() {
+        // No destruction necessary, SigningResults are transient, just release
+        $this->release();
+        parent::__destruct();
+    }
+
+    public static function fromNative($ptr) {
+        return new SigningResult($ptr);
+    }
+
+    public function applyToHttpRequest(&$http_request) {
+        self::$crt->signing_result_apply_to_http_request($this->native, $http_request->native);
+        // Update http_request from native
+        $http_request = Request::unmarshall($http_request->toBlob());
+    }
+}

+ 35 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Auth/StaticCredentialsProvider.php

@@ -0,0 +1,35 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\Auth;
+
+/**
+ * Provides a static set of AWS credentials
+ *
+ * @param array options:
+ * - string access_key_id - AWS Access Key Id
+ * - string secret_access_key - AWS Secret Access Key
+ * - string session_token - Optional STS session token
+ */
+final class StaticCredentialsProvider extends CredentialsProvider {
+
+    private $credentials;
+
+    public function __get($name) {
+        return $this->$name;
+    }
+
+    function __construct(array $options = []) {
+        parent::__construct();
+        $this->credentials = new AwsCredentials($options);
+
+        $provider_options = self::$crt->credentials_provider_static_options_new();
+        self::$crt->credentials_provider_static_options_set_access_key_id($provider_options, $this->credentials->access_key_id);
+        self::$crt->credentials_provider_static_options_set_secret_access_key($provider_options, $this->credentials->secret_access_key);
+        self::$crt->credentials_provider_static_options_set_session_token($provider_options, $this->credentials->session_token);
+        $this->acquire(self::$crt->credentials_provider_static_new($provider_options));
+        self::$crt->credentials_provider_static_options_release($provider_options);
+    }
+}

+ 358 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/CRT.php

@@ -0,0 +1,358 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT;
+
+use AWS\CRT\Internal\Extension;
+
+use \RuntimeException;
+
+/**
+ * Wrapper for the interface to the CRT. There only ever needs to be one of these, but
+ * additional instances won't cost anything other than their memory.
+ * Creating an instance of any NativeResource will activate the CRT binding. User code
+ * should only need to create one of these if they are only accessing CRT:: static functions.
+ */
+final class CRT {
+
+    private static $impl = null;
+    private static $refcount = 0;
+
+    function __construct() {
+        if (is_null(self::$impl)) {
+            try {
+                self::$impl = new Extension();
+            } catch (RuntimeException $rex) {
+                throw new RuntimeException("Unable to initialize AWS CRT via awscrt extension: \n$rex", -1);
+            }
+        }
+        ++self::$refcount;
+    }
+
+    function __destruct() {
+        if (--self::$refcount == 0) {
+            self::$impl = null;
+        }
+    }
+
+    /**
+     * @return bool whether or not the CRT is currently loaded
+     */
+    public static function isLoaded() {
+        return !is_null(self::$impl);
+    }
+
+    /**
+     * @return bool whether or not the CRT is available via one of the possible backends
+     */
+    public static function isAvailable() {
+        try {
+            new CRT();
+            return true;
+        } catch (RuntimeException $ex) {
+            return false;
+        }
+    }
+
+    /**
+     * @return integer last error code reported within the CRT
+     */
+    public static function last_error() {
+        return self::$impl->aws_crt_last_error();
+    }
+
+    /**
+     * @param integer $error Error code from the CRT, usually delivered via callback or {@see last_error}
+     * @return string Human-readable description of the provided error code
+     */
+    public static function error_str($error) {
+        return self::$impl->aws_crt_error_str((int) $error);
+    }
+
+    /**
+     * @param integer $error Error code from the CRT, usually delivered via callback or {@see last_error}
+     * @return string Name/enum identifier for the provided error code
+     */
+    public static function error_name($error) {
+        return self::$impl->aws_crt_error_name((int) $error);
+    }
+
+    public static function log_to_stdout() {
+        return self::$impl->aws_crt_log_to_stdout();
+    }
+
+    public static function log_to_stderr() {
+        return self::$impl->aws_crt_log_to_stderr();
+    }
+
+    public static function log_to_file($filename) {
+        return self::$impl->aws_crt_log_to_file($filename);
+    }
+
+    public static function log_to_stream($stream) {
+        return self::$impl->aws_crt_log_to_stream($stream);
+    }
+
+    public static function log_set_level($level) {
+        return self::$impl->aws_crt_log_set_level($level);
+    }
+
+    public static function log_stop() {
+        return self::$impl->aws_crt_log_stop();
+    }
+
+    public static function log_message($level, $message) {
+        return self::$impl->aws_crt_log_message($level, $message);
+    }
+
+    /**
+     * @return object Pointer to native event_loop_group_options
+     */
+    function event_loop_group_options_new() {
+        return self::$impl->aws_crt_event_loop_group_options_new();
+    }
+
+    /**
+     * @param object $elg_options Pointer to native event_loop_group_options
+     */
+    function event_loop_group_options_release($elg_options) {
+        self::$impl->aws_crt_event_loop_group_options_release($elg_options);
+    }
+
+    /**
+     * @param object $elg_options Pointer to native event_loop_group_options
+     * @param integer $max_threads Maximum number of threads to allow the event loop group to use, default: 0/1 per CPU core
+     */
+    function event_loop_group_options_set_max_threads($elg_options, $max_threads) {
+        self::$impl->aws_crt_event_loop_group_options_set_max_threads($elg_options, (int)$max_threads);
+    }
+
+    /**
+     * @param object Pointer to event_loop_group_options, {@see event_loop_group_options_new}
+     * @return object Pointer to the new event loop group
+     */
+    function event_loop_group_new($options) {
+        return self::$impl->aws_crt_event_loop_group_new($options);
+    }
+
+    /**
+     * @param object $elg Pointer to the event loop group to release
+     */
+    function event_loop_group_release($elg) {
+        self::$impl->aws_crt_event_loop_group_release($elg);
+    }
+
+    /**
+     * return object Pointer to native AWS credentials options
+     */
+    function aws_credentials_options_new() {
+        return self::$impl->aws_crt_credentials_options_new();
+    }
+
+    function aws_credentials_options_release($options) {
+        self::$impl->aws_crt_credentials_options_release($options);
+    }
+
+    function aws_credentials_options_set_access_key_id($options, $access_key_id) {
+        self::$impl->aws_crt_credentials_options_set_access_key_id($options, $access_key_id);
+    }
+
+    function aws_credentials_options_set_secret_access_key($options, $secret_access_key) {
+        self::$impl->aws_crt_credentials_options_set_secret_access_key($options, $secret_access_key);
+    }
+
+    function aws_credentials_options_set_session_token($options, $session_token) {
+        self::$impl->aws_crt_credentials_options_set_session_token($options, $session_token);
+    }
+
+    function aws_credentials_options_set_expiration_timepoint_seconds($options, $expiration_timepoint_seconds) {
+        self::$impl->aws_crt_credentials_options_set_expiration_timepoint_seconds($options, $expiration_timepoint_seconds);
+    }
+
+    function aws_credentials_new($options) {
+        return self::$impl->aws_crt_credentials_new($options);
+    }
+
+    function aws_credentials_release($credentials) {
+        self::$impl->aws_crt_credentials_release($credentials);
+    }
+
+    function credentials_provider_release($provider) {
+        self::$impl->aws_crt_credentials_provider_release($provider);
+    }
+
+    function credentials_provider_static_options_new() {
+        return self::$impl->aws_crt_credentials_provider_static_options_new();
+    }
+
+    function credentials_provider_static_options_release($options) {
+        self::$impl->aws_crt_credentials_provider_static_options_release($options);
+    }
+
+    function credentials_provider_static_options_set_access_key_id($options, $access_key_id) {
+        self::$impl->aws_crt_credentials_provider_static_options_set_access_key_id($options, $access_key_id);
+    }
+
+    function credentials_provider_static_options_set_secret_access_key($options, $secret_access_key) {
+        self::$impl->aws_crt_credentials_provider_static_options_set_secret_access_key($options, $secret_access_key);
+    }
+
+    function credentials_provider_static_options_set_session_token($options, $session_token) {
+        self::$impl->aws_crt_credentials_provider_static_options_set_session_token($options, $session_token);
+    }
+
+    function credentials_provider_static_new($options) {
+        return self::$impl->aws_crt_credentials_provider_static_new($options);
+    }
+
+    function input_stream_options_new() {
+        return self::$impl->aws_crt_input_stream_options_new();
+    }
+
+    function input_stream_options_release($options) {
+        self::$impl->aws_crt_input_stream_options_release($options);
+    }
+
+    function input_stream_options_set_user_data($options, $user_data) {
+        self::$impl->aws_crt_input_stream_options_set_user_data($options, $user_data);
+    }
+
+    function input_stream_new($options) {
+        return self::$impl->aws_crt_input_stream_new($options);
+    }
+
+    function input_stream_release($stream) {
+        self::$impl->aws_crt_input_stream_release($stream);
+    }
+
+    function input_stream_seek($stream, $offset, $basis) {
+        return self::$impl->aws_crt_input_stream_seek($stream, $offset, $basis);
+    }
+
+    function input_stream_read($stream, $length) {
+        return self::$impl->aws_crt_input_stream_read($stream, $length);
+    }
+
+    function input_stream_eof($stream) {
+        return self::$impl->aws_crt_input_stream_eof($stream);
+    }
+
+    function input_stream_get_length($stream) {
+        return self::$impl->aws_crt_input_stream_get_length($stream);
+    }
+
+    function http_message_new_from_blob($blob) {
+        return self::$impl->aws_crt_http_message_new_from_blob($blob);
+    }
+
+    function http_message_to_blob($message) {
+        return self::$impl->aws_crt_http_message_to_blob($message);
+    }
+
+    function http_message_release($message) {
+        self::$impl->aws_crt_http_message_release($message);
+    }
+
+    function signing_config_aws_new() {
+        return self::$impl->aws_crt_signing_config_aws_new();
+    }
+
+    function signing_config_aws_release($signing_config) {
+        return self::$impl->aws_crt_signing_config_aws_release($signing_config);
+    }
+
+    function signing_config_aws_set_algorithm($signing_config, $algorithm) {
+        self::$impl->aws_crt_signing_config_aws_set_algorithm($signing_config, (int)$algorithm);
+    }
+
+    function signing_config_aws_set_signature_type($signing_config, $signature_type) {
+        self::$impl->aws_crt_signing_config_aws_set_signature_type($signing_config, (int)$signature_type);
+    }
+
+    function signing_config_aws_set_credentials_provider($signing_config, $credentials_provider) {
+        self::$impl->aws_crt_signing_config_aws_set_credentials_provider($signing_config, $credentials_provider);
+    }
+
+    function signing_config_aws_set_region($signing_config, $region) {
+        self::$impl->aws_crt_signing_config_aws_set_region($signing_config, $region);
+    }
+
+    function signing_config_aws_set_service($signing_config, $service) {
+        self::$impl->aws_crt_signing_config_aws_set_service($signing_config, $service);
+    }
+
+    function signing_config_aws_set_use_double_uri_encode($signing_config, $use_double_uri_encode) {
+        self::$impl->aws_crt_signing_config_aws_set_use_double_uri_encode($signing_config, $use_double_uri_encode);
+    }
+
+    function signing_config_aws_set_should_normalize_uri_path($signing_config, $should_normalize_uri_path) {
+        self::$impl->aws_crt_signing_config_aws_set_should_normalize_uri_path($signing_config, $should_normalize_uri_path);
+    }
+
+    function signing_config_aws_set_omit_session_token($signing_config, $omit_session_token) {
+        self::$impl->aws_crt_signing_config_aws_set_omit_session_token($signing_config, $omit_session_token);
+    }
+
+    function signing_config_aws_set_signed_body_value($signing_config, $signed_body_value) {
+        self::$impl->aws_crt_signing_config_aws_set_signed_body_value($signing_config, $signed_body_value);
+    }
+
+    function signing_config_aws_set_signed_body_header_type($signing_config, $signed_body_header_type) {
+        self::$impl->aws_crt_signing_config_aws_set_signed_body_header_type($signing_config, $signed_body_header_type);
+    }
+
+    function signing_config_aws_set_expiration_in_seconds($signing_config, $expiration_in_seconds) {
+        self::$impl->aws_crt_signing_config_aws_set_expiration_in_seconds($signing_config, $expiration_in_seconds);
+    }
+
+    function signing_config_aws_set_date($signing_config, $timestamp) {
+        self::$impl->aws_crt_signing_config_aws_set_date($signing_config, $timestamp);
+    }
+
+    function signing_config_aws_set_should_sign_header_fn($signing_config, $should_sign_header_fn) {
+        self::$impl->aws_crt_signing_config_aws_set_should_sign_header_fn($signing_config, $should_sign_header_fn);
+    }
+
+    function signable_new_from_http_request($http_message) {
+        return self::$impl->aws_crt_signable_new_from_http_request($http_message);
+    }
+
+    function signable_new_from_chunk($chunk_stream, $previous_signature) {
+        return self::$impl->aws_crt_signable_new_from_chunk($chunk_stream, $previous_signature);
+    }
+
+    function signable_new_from_canonical_request($canonical_request) {
+        return self::$impl->aws_crt_signable_new_from_canonical_request($canonical_request);
+    }
+
+    function signable_release($signable) {
+        self::$impl->aws_crt_signable_release($signable);
+    }
+
+    function signing_result_release($signing_result) {
+        self::$impl->aws_crt_signing_result_release($signing_result);
+    }
+
+    function signing_result_apply_to_http_request($signing_result, $http_message) {
+        return self::$impl->aws_crt_signing_result_apply_to_http_request(
+            $signing_result, $http_message);
+    }
+
+    function sign_request_aws($signable, $signing_config, $on_complete, $user_data) {
+        return self::$impl->aws_crt_sign_request_aws($signable, $signing_config, $on_complete, $user_data);
+    }
+
+    function test_verify_sigv4a_signing($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y) {
+        return self::$impl->aws_crt_test_verify_sigv4a_signing($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y);
+    }
+
+    public static function crc32($input, $previous = 0) {
+        return self::$impl->aws_crt_crc32($input, $previous);
+    }
+
+    public static function crc32c($input, $previous = 0) {
+        return self::$impl->aws_crt_crc32c($input, $previous);
+    }
+}

+ 50 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Headers.php

@@ -0,0 +1,50 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\HTTP;
+
+use AWS\CRT\Internal\Encoding;
+
+final class Headers {
+    private $headers;
+
+    public function __construct($headers = []) {
+        $this->headers = $headers;
+    }
+
+    public static function marshall($headers) {
+        $buf = "";
+        foreach ($headers->headers as $header => $value) {
+            $buf .= Encoding::encodeString($header);
+            $buf .= Encoding::encodeString($value);
+        }
+        return $buf;
+    }
+
+    public static function unmarshall($buf) {
+        $strings = Encoding::readStrings($buf);
+        $headers = [];
+        for ($idx = 0; $idx < count($strings);) {
+            $headers[$strings[$idx++]] = $strings[$idx++];
+        }
+        return new Headers($headers);
+    }
+
+    public function count() {
+        return count($this->headers);
+    }
+
+    public function get($header) {
+        return isset($this->headers[$header]) ? $this->headers[$header] : null;
+    }
+
+    public function set($header, $value) {
+        $this->headers[$header] = $value;
+    }
+
+    public function toArray() {
+        return $this->headers;
+    }
+}

+ 95 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Message.php

@@ -0,0 +1,95 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\HTTP;
+
+use AWS\CRT\NativeResource;
+use AWS\CRT\Internal\Encoding;
+
+abstract class Message extends NativeResource {
+    private $method;
+    private $path;
+    private $query;
+    private $headers;
+
+    public function __construct($method, $path, $query = [], $headers = []) {
+        parent::__construct();
+        $this->method = $method;
+        $this->path = $path;
+        $this->query = $query;
+        $this->headers = new Headers($headers);
+        $this->acquire(self::$crt->http_message_new_from_blob(self::marshall($this)));
+    }
+
+    public function __destruct() {
+        self::$crt->http_message_release($this->release());
+        parent::__destruct();
+    }
+
+    public function toBlob() {
+        return self::$crt->http_message_to_blob($this->native);
+    }
+
+    protected static function marshall($msg) {
+        $buf = "";
+        $buf .= Encoding::encodeString($msg->method);
+        $buf .= Encoding::encodeString($msg->pathAndQuery());
+        $buf .= Headers::marshall($msg->headers);
+        return $buf;
+    }
+
+    protected static function _unmarshall($buf, $class=Message::class) {
+        $method = Encoding::readString($buf);
+        $path_and_query = Encoding::readString($buf);
+        $parts = explode("?", $path_and_query, 2);
+        $path = isset($parts[0]) ? $parts[0] : "";
+        $query = isset($parts[1]) ? $parts[1] : "";
+        $headers = Headers::unmarshall($buf);
+
+        // Turn query params back into a dictionary
+        if (strlen($query)) {
+            $query = rawurldecode($query);
+            $query = explode("&", $query);
+            $query = array_reduce($query, function($params, $pair) {
+                list($param, $value) = explode("=", $pair, 2);
+                $params[$param] = $value;
+                return $params;
+            }, []);
+        } else {
+            $query = [];
+        }
+
+        return new $class($method, $path, $query, $headers->toArray());
+    }
+
+    public function pathAndQuery() {
+        $path = $this->path;
+        $queries = [];
+        foreach ($this->query as $param => $value) {
+            $queries []= urlencode($param) . "=" . urlencode($value);
+        }
+        $query = implode("&", $queries);
+        if (strlen($query)) {
+            $path = implode("?", [$path, $query]);
+        }
+        return $path;
+    }
+
+    public function method() {
+        return $this->method;
+    }
+
+    public function path() {
+        return $this->path;
+    }
+
+    public function query() {
+        return $this->query;
+    }
+
+    public function headers() {
+        return $this->headers;
+    }
+}

+ 32 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Request.php

@@ -0,0 +1,32 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\HTTP;
+
+use AWS\CRT\IO\InputStream;
+
+class Request extends Message {
+    private $body_stream = null;
+
+    public function __construct($method, $path, $query = [], $headers = [], $body_stream = null) {
+        parent::__construct($method, $path, $query, $headers);
+        if (!is_null($body_stream) && !($body_stream instanceof InputStream)) {
+            throw new \InvalidArgumentException('body_stream must be an instance of ' . InputStream::class);
+        }
+        $this->body_stream = $body_stream;
+    }
+
+    public static function marshall($request) {
+        return parent::marshall($request);
+    }
+
+    public static function unmarshall($buf) {
+        return parent::_unmarshall($buf, Request::class);
+    }
+
+    public function body_stream() {
+        return $this->body_stream;
+    }
+}

+ 27 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Response.php

@@ -0,0 +1,27 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\HTTP;
+
+class Response extends Message {
+    private $status_code;
+
+    public function __construct($method, $path, $query, $headers, $status_code) {
+        parent::__construct($method, $path, $query, $headers);
+        $this->status_code = $status_code;
+    }
+
+    public static function marshall($response) {
+        return parent::marshall($response);
+    }
+
+    public static function unmarshall($buf) {
+        return parent::_unmarshall($buf, Response::class);
+    }
+
+    public function status_code() {
+        return $this->status_code;
+    }
+}

+ 39 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/IO/EventLoopGroup.php

@@ -0,0 +1,39 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\IO;
+
+use AWS\CRT\NativeResource as NativeResource;
+use AWS\CRT\Options as Options;
+
+/**
+ * Represents 1 or more event loops (1 per thread) for doing I/O and background tasks.
+ * Typically, every application has one EventLoopGroup.
+ *
+ * @param array options:
+ * - int num_threads - Number of worker threads in the EventLoopGroup. Defaults to 0/1 per logical core.
+ */
+final class EventLoopGroup extends NativeResource {
+
+    static function defaults() {
+        return [
+            'max_threads' => 0,
+        ];
+    }
+
+    function __construct(array $options = []) {
+        parent::__construct();
+        $options = new Options($options, self::defaults());
+        $elg_options = self::$crt->event_loop_group_options_new();
+        self::$crt->event_loop_group_options_set_max_threads($elg_options, $options->getInt('max_threads'));
+        $this->acquire(self::$crt->event_loop_group_new($elg_options));
+        self::$crt->event_loop_group_options_release($elg_options);
+    }
+
+    function __destruct() {
+        self::$crt->event_loop_group_release($this->release());
+        parent::__destruct();
+    }
+}

+ 50 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/IO/InputStream.php

@@ -0,0 +1,50 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\IO;
+
+use AWS\CRT\NativeResource as NativeResource;
+
+final class InputStream extends NativeResource {
+    private $stream = null;
+
+    const SEEK_BEGIN = 0;
+    const SEEK_END = 2;
+
+    public function __construct($stream) {
+        parent::__construct();
+        $this->stream = $stream;
+        $options = self::$crt->input_stream_options_new();
+        // The stream implementation in native just converts the PHP stream into
+        // a native php_stream* and executes operations entirely in native
+        self::$crt->input_stream_options_set_user_data($options, $stream);
+        $this->acquire(self::$crt->input_stream_new($options));
+        self::$crt->input_stream_options_release($options);
+    }
+
+    public function __destruct() {
+        $this->release();
+        parent::__destruct();
+    }
+
+    public function eof() {
+        return self::$crt->input_stream_eof($this->native);
+    }
+
+    public function length() {
+        return self::$crt->input_stream_get_length($this->native);
+    }
+
+    public function read($length = 0) {
+        if ($length == 0) {
+            $length = $this->length();
+        }
+        return self::$crt->input_stream_read($this->native, $length);
+    }
+
+    public function seek($offset, $basis) {
+        return self::$crt->input_stream_seek($this->native, $offset, $basis);
+    }
+}

+ 37 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Internal/Encoding.php

@@ -0,0 +1,37 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\Internal;
+
+final class Encoding {
+    public static function readString(&$buffer) {
+        list($len, $str) = self::decodeString($buffer);
+        // Advance by sizeof(length) + strlen(str)
+        $buffer = substr($buffer, 4 + $len);
+        return $str;
+    }
+
+    public static function readStrings($buffer) {
+        $strings = [];
+        while (strlen($buffer)) {
+            $strings []= self::readString($buffer);
+        }
+        return $strings;
+    }
+
+    public static function decodeString($buffer) {
+        $len = unpack("N", $buffer)[1];
+        $buffer = substr($buffer, 4);
+        $str = unpack("a{$len}", $buffer)[1];
+        return [$len, $str];
+    }
+
+    public static function encodeString($str) {
+        if (is_array($str)) {
+            $str = $str[0];
+        }
+        return pack("Na*", strlen($str), $str);
+    }
+}

+ 29 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Internal/Extension.php

@@ -0,0 +1,29 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT\Internal;
+
+use \RuntimeException;
+
+/**
+ * @internal
+ * Forwards calls on to awscrt PHP extension functions
+ */
+final class Extension {
+    function __construct() {
+        if (!extension_loaded('awscrt')) {
+            throw new RuntimeException('awscrt extension is not loaded');
+        }
+    }
+
+    /**
+     * Forwards any call made on this object to the extension function of the
+     * same name with the supplied arguments. Argument type hinting and checking
+     * occurs at the CRT wrapper.
+     */
+    function __call($name, $args) {
+        return call_user_func_array($name, $args);
+    }
+}

+ 47 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Log.php

@@ -0,0 +1,47 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT;
+use AWS\CRT\CRT;
+
+final class Log {
+    const NONE = 0;
+    const FATAL = 1;
+    const ERROR = 2;
+    const WARN = 3;
+    const INFO = 4;
+    const DEBUG = 5;
+    const TRACE = 6;
+
+    public static function toStdout() {
+        CRT::log_to_stdout();
+    }
+
+    public static function toStderr() {
+        CRT::log_to_stderr();
+    }
+
+    public static function toFile($filename) {
+        CRT::log_to_file($filename);
+    }
+
+    public static function toStream($stream) {
+        assert(get_resource_type($stream) == "stream");
+        CRT::log_to_stream($stream);
+    }
+
+    public static function stop() {
+        CRT::log_stop();
+    }
+
+    public static function setLogLevel($level) {
+        assert($level >= self::NONE && $level <= self::TRACE);
+        CRT::log_set_level($level);
+    }
+
+    public static function log($level, $message) {
+        CRT::log_message($level, $message);
+    }
+}

+ 42 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/NativeResource.php

@@ -0,0 +1,42 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT;
+
+use AWS\CRT\CRT as CRT;
+
+/**
+ * Base class for all native resources, tracks all outstanding resources
+ * and provides basic leak checking
+ */
+abstract class NativeResource {
+    protected static $crt = null;
+    protected static $resources = [];
+    protected $native = null;
+
+    protected function __construct() {
+        if (is_null(self::$crt)) {
+            self::$crt = new CRT();
+        }
+
+        self::$resources[spl_object_hash($this)] = 1;
+    }
+
+    protected function acquire($handle) {
+        return $this->native = $handle;
+    }
+
+    protected function release() {
+        $native = $this->native;
+        $this->native = null;
+        return $native;
+    }
+
+    function __destruct() {
+        // Should have been destroyed and released by derived resource
+        assert($this->native == null);
+        unset(self::$resources[spl_object_hash($this)]);
+    }
+}

+ 77 - 0
vendor/aws/aws-crt-php/src/AWS/CRT/Options.php

@@ -0,0 +1,77 @@
+<?php
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+namespace AWS\CRT;
+
+final class OptionValue {
+    private $value;
+    function __construct($value) {
+        $this->value = $value;
+    }
+
+    public function asObject() {
+        return $this->value;
+    }
+
+    public function asMixed() {
+        return $this->value;
+    }
+
+    public function asInt() {
+        return empty($this->value) ? 0 : (int)$this->value;
+    }
+
+    public function asBool() {
+        return boolval($this->value);
+    }
+
+    public function asString() {
+        return !empty($this->value) ? strval($this->value) : "";
+    }
+
+    public function asArray() {
+        return is_array($this->value) ? $this->value : (!empty($this->value) ? [$this->value] : []);
+    }
+
+    public function asCallable() {
+        return is_callable($this->value) ? $this->value : null;
+    }
+}
+
+final class Options {
+    private $options;
+
+    public function __construct($opts = [], $defaults = []) {
+        $this->options = array_replace($defaults, empty($opts) ? [] : $opts);
+    }
+
+    public function __get($name) {
+        return $this->get($name);
+    }
+
+    public function asArray() {
+        return $this->options;
+    }
+
+    public function toArray() {
+        return array_merge_recursive([], $this->options);
+    }
+
+    public function get($name) {
+        return new OptionValue($this->options[$name]);
+    }
+
+    public function getInt($name) {
+        return $this->get($name)->asInt();
+    }
+
+    public function getString($name) {
+        return $this->get($name)->asString();
+    }
+
+    public function getBool($name) {
+        return $this->get($name)->asBool();
+    }
+}

+ 4 - 0
vendor/aws/aws-sdk-php/CODE_OF_CONDUCT.md

@@ -0,0 +1,4 @@
+## Code of Conduct
+This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 
+For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 
+opensource-codeofconduct@amazon.com with any additional questions or comments.

+ 4 - 0
vendor/aws/aws-sdk-php/CRT_INSTRUCTIONS.md

@@ -0,0 +1,4 @@
+## Building and enabling the Common Run Time
+
+1. **Follow instructions on crt repo** – Clone and build the repo as shown [here][https://github.com/awslabs/aws-crt-php].
+1. **Enable the CRT** – add the following line to your php.ini file `extension=path/to/aws-crt-php/modules/awscrt.so`

+ 141 - 0
vendor/aws/aws-sdk-php/LICENSE

@@ -0,0 +1,141 @@
+# Apache License
+Version 2.0, January 2004
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+## 1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1
+through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the
+License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled
+by, or are under common control with that entity. For the purposes of this definition, "control" means
+(i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract
+or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial
+ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including but not limited to software
+source code, documentation source, and configuration files.
+
+"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form,
+including but not limited to compiled object code, generated documentation, and conversions to other media
+types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License,
+as indicated by a copyright notice that is included in or attached to the work (an example is provided in the
+Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from)
+the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent,
+as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not
+include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work
+and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version of the Work and any
+modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to
+Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to
+submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of
+electronic, verbal, or written communication sent to the Licensor or its representatives, including but not
+limited to communication on electronic mailing lists, source code control systems, and issue tracking systems
+that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but
+excluding communication that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been
+received by Licensor and subsequently incorporated within the Work.
+
+## 2. Grant of Copyright License.
+
+Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual,
+worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare
+Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such
+Derivative Works in Source or Object form.
+
+## 3. Grant of Patent License.
+
+Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual,
+worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent
+license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such
+license applies only to those patent claims licensable by such Contributor that are necessarily infringed by
+their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such
+Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim
+or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work
+constitutes direct or contributory patent infringement, then any patent licenses granted to You under this
+License for that Work shall terminate as of the date such litigation is filed.
+
+## 4. Redistribution.
+
+You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without
+modifications, and in Source or Object form, provided that You meet the following conditions:
+
+   1. You must give any other recipients of the Work or Derivative Works a copy of this License; and
+
+   2. You must cause any modified files to carry prominent notices stating that You changed the files; and
+
+   3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent,
+	  trademark, and attribution notices from the Source form of the Work, excluding those notices that do
+	  not pertain to any part of the Derivative Works; and
+
+   4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that
+	  You distribute must include a readable copy of the attribution notices contained within such NOTICE
+	  file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one
+	  of the following places: within a NOTICE text file distributed as part of the Derivative Works; within
+	  the Source form or documentation, if provided along with the Derivative Works; or, within a display
+	  generated by the Derivative Works, if and wherever such third-party notices normally appear. The
+	  contents of the NOTICE file are for informational purposes only and do not modify the License. You may
+	  add Your own attribution notices within Derivative Works that You distribute, alongside or as an
+	  addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be
+	  construed as modifying the License.
+
+You may add Your own copyright statement to Your modifications and may provide additional or different license
+terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative
+Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the
+conditions stated in this License.
+
+## 5. Submission of Contributions.
+
+Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by
+You to the Licensor shall be under the terms and conditions of this License, without any additional terms or
+conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate
+license agreement you may have executed with Licensor regarding such Contributions.
+
+## 6. Trademarks.
+
+This License does not grant permission to use the trade names, trademarks, service marks, or product names of
+the Licensor, except as required for reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+## 7. Disclaimer of Warranty.
+
+Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor
+provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the
+appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of
+permissions under this License.
+
+## 8. Limitation of Liability.
+
+In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless
+required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any
+Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential
+damages of any character arising as a result of this License or out of the use or inability to use the Work
+(including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or
+any and all other commercial damages or losses), even if such Contributor has been advised of the possibility
+of such damages.
+
+## 9. Accepting Warranty or Additional Liability.
+
+While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for,
+acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this
+License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole
+responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold
+each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason
+of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS

+ 17 - 0
vendor/aws/aws-sdk-php/NOTICE

@@ -0,0 +1,17 @@
+# AWS SDK for PHP
+
+<http://aws.amazon.com/php>
+
+Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License").
+You may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.

+ 84 - 0
vendor/aws/aws-sdk-php/THIRD-PARTY-LICENSES

@@ -0,0 +1,84 @@
+The AWS SDK for PHP includes the following third-party software/licensing:
+
+
+** Guzzle - https://github.com/guzzle/guzzle
+
+Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+----------------
+
+** jmespath.php - https://github.com/mtdowling/jmespath.php
+
+Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+----------------
+
+** phpunit-mock-objects -- https://github.com/sebastianbergmann/phpunit-mock-objects
+
+Copyright (c) 2002-2018, Sebastian Bergmann <sebastian@phpunit.de>.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ * Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+
+ * Neither the name of Sebastian Bergmann nor the names of his
+   contributors may be used to endorse or promote products derived
+   from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.

+ 74 - 0
vendor/aws/aws-sdk-php/composer.json

@@ -0,0 +1,74 @@
+{
+    "name": "aws/aws-sdk-php",
+    "homepage": "http://aws.amazon.com/sdkforphp",
+    "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
+    "keywords": ["aws","amazon","sdk","s3","ec2","dynamodb","cloud","glacier"],
+    "type": "library",
+    "license": "Apache-2.0",
+    "authors": [
+        {
+            "name": "Amazon Web Services",
+            "homepage": "http://aws.amazon.com"
+        }
+    ],
+    "support": {
+        "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
+        "issues": "https://github.com/aws/aws-sdk-php/issues"
+    },
+    "require": {
+        "php": ">=7.2.5",
+        "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5",
+        "guzzlehttp/psr7": "^1.9.1 || ^2.4.5",
+        "guzzlehttp/promises": "^1.4.0 || ^2.0",
+        "mtdowling/jmespath.php": "^2.6",
+        "ext-pcre": "*",
+        "ext-json": "*",
+        "ext-simplexml": "*",
+        "aws/aws-crt-php": "^1.2.3",
+        "psr/http-message": "^1.0 || ^2.0"
+    },
+    "require-dev": {
+        "composer/composer" : "^1.10.22",
+        "ext-openssl": "*",
+        "ext-dom": "*",
+        "ext-pcntl": "*",
+        "ext-sockets": "*",
+        "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5",
+        "behat/behat": "~3.0",
+        "doctrine/cache": "~1.4",
+        "aws/aws-php-sns-message-validator": "~1.0",
+        "nette/neon": "^2.3",
+        "andrewsville/php-token-reflection": "^1.4",
+        "psr/cache": "^1.0",
+        "psr/simple-cache": "^1.0",
+        "paragonie/random_compat": ">= 2",
+        "sebastian/comparator": "^1.2.3 || ^4.0",
+        "yoast/phpunit-polyfills": "^1.0",
+        "dms/phpunit-arraysubset-asserts": "^0.4.0"
+    },
+    "suggest": {
+        "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages",
+        "ext-curl": "To send requests using cURL",
+        "ext-sockets": "To use client-side monitoring",
+        "doctrine/cache": "To use the DoctrineCacheAdapter",
+        "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications"
+    },
+    "autoload": {
+        "psr-4": {
+            "Aws\\": "src/"
+        },
+        "files": ["src/functions.php"]
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "Aws\\Test\\": "tests/"
+        },
+        "classmap": ["build/"]
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.0-dev"
+        }
+    }
+}
+

+ 55 - 0
vendor/aws/aws-sdk-php/src/ACMPCA/ACMPCAClient.php

@@ -0,0 +1,55 @@
+<?php
+namespace Aws\ACMPCA;
+
+use Aws\AwsClient;
+
+/**
+ * This client is used to interact with the **AWS Certificate Manager Private Certificate Authority** service.
+ * @method \Aws\Result createCertificateAuthority(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createCertificateAuthorityAsync(array $args = [])
+ * @method \Aws\Result createCertificateAuthorityAuditReport(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createCertificateAuthorityAuditReportAsync(array $args = [])
+ * @method \Aws\Result createPermission(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createPermissionAsync(array $args = [])
+ * @method \Aws\Result deleteCertificateAuthority(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteCertificateAuthorityAsync(array $args = [])
+ * @method \Aws\Result deletePermission(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deletePermissionAsync(array $args = [])
+ * @method \Aws\Result deletePolicy(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deletePolicyAsync(array $args = [])
+ * @method \Aws\Result describeCertificateAuthority(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise describeCertificateAuthorityAsync(array $args = [])
+ * @method \Aws\Result describeCertificateAuthorityAuditReport(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise describeCertificateAuthorityAuditReportAsync(array $args = [])
+ * @method \Aws\Result getCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getCertificateAsync(array $args = [])
+ * @method \Aws\Result getCertificateAuthorityCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getCertificateAuthorityCertificateAsync(array $args = [])
+ * @method \Aws\Result getCertificateAuthorityCsr(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getCertificateAuthorityCsrAsync(array $args = [])
+ * @method \Aws\Result getPolicy(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getPolicyAsync(array $args = [])
+ * @method \Aws\Result importCertificateAuthorityCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise importCertificateAuthorityCertificateAsync(array $args = [])
+ * @method \Aws\Result issueCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise issueCertificateAsync(array $args = [])
+ * @method \Aws\Result listCertificateAuthorities(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listCertificateAuthoritiesAsync(array $args = [])
+ * @method \Aws\Result listPermissions(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listPermissionsAsync(array $args = [])
+ * @method \Aws\Result listTags(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listTagsAsync(array $args = [])
+ * @method \Aws\Result putPolicy(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise putPolicyAsync(array $args = [])
+ * @method \Aws\Result restoreCertificateAuthority(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise restoreCertificateAuthorityAsync(array $args = [])
+ * @method \Aws\Result revokeCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise revokeCertificateAsync(array $args = [])
+ * @method \Aws\Result tagCertificateAuthority(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise tagCertificateAuthorityAsync(array $args = [])
+ * @method \Aws\Result untagCertificateAuthority(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise untagCertificateAuthorityAsync(array $args = [])
+ * @method \Aws\Result updateCertificateAuthority(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateCertificateAuthorityAsync(array $args = [])
+ */
+class ACMPCAClient extends AwsClient {}

+ 9 - 0
vendor/aws/aws-sdk-php/src/ACMPCA/Exception/ACMPCAException.php

@@ -0,0 +1,9 @@
+<?php
+namespace Aws\ACMPCA\Exception;
+
+use Aws\Exception\AwsException;
+
+/**
+ * Represents an error interacting with the **AWS Certificate Manager Private Certificate Authority** service.
+ */
+class ACMPCAException extends AwsException {}

+ 31 - 0
vendor/aws/aws-sdk-php/src/ARCZonalShift/ARCZonalShiftClient.php

@@ -0,0 +1,31 @@
+<?php
+namespace Aws\ARCZonalShift;
+
+use Aws\AwsClient;
+
+/**
+ * This client is used to interact with the **AWS ARC - Zonal Shift** service.
+ * @method \Aws\Result cancelZonalShift(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise cancelZonalShiftAsync(array $args = [])
+ * @method \Aws\Result createPracticeRunConfiguration(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createPracticeRunConfigurationAsync(array $args = [])
+ * @method \Aws\Result deletePracticeRunConfiguration(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deletePracticeRunConfigurationAsync(array $args = [])
+ * @method \Aws\Result getManagedResource(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getManagedResourceAsync(array $args = [])
+ * @method \Aws\Result listAutoshifts(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listAutoshiftsAsync(array $args = [])
+ * @method \Aws\Result listManagedResources(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listManagedResourcesAsync(array $args = [])
+ * @method \Aws\Result listZonalShifts(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listZonalShiftsAsync(array $args = [])
+ * @method \Aws\Result startZonalShift(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise startZonalShiftAsync(array $args = [])
+ * @method \Aws\Result updatePracticeRunConfiguration(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updatePracticeRunConfigurationAsync(array $args = [])
+ * @method \Aws\Result updateZonalAutoshiftConfiguration(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateZonalAutoshiftConfigurationAsync(array $args = [])
+ * @method \Aws\Result updateZonalShift(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateZonalShiftAsync(array $args = [])
+ */
+class ARCZonalShiftClient extends AwsClient {}

+ 9 - 0
vendor/aws/aws-sdk-php/src/ARCZonalShift/Exception/ARCZonalShiftException.php

@@ -0,0 +1,9 @@
+<?php
+namespace Aws\ARCZonalShift\Exception;
+
+use Aws\Exception\AwsException;
+
+/**
+ * Represents an error interacting with the **AWS ARC - Zonal Shift** service.
+ */
+class ARCZonalShiftException extends AwsException {}

+ 157 - 0
vendor/aws/aws-sdk-php/src/AbstractConfigurationProvider.php

@@ -0,0 +1,157 @@
+<?php
+namespace Aws;
+
+use GuzzleHttp\Promise;
+
+/**
+ * A configuration provider is a function that returns a promise that is
+ * fulfilled with a configuration object. This class provides base functionality
+ * usable by specific configuration provider implementations
+ */
+abstract class AbstractConfigurationProvider
+{
+    const ENV_PROFILE = 'AWS_PROFILE';
+    const ENV_CONFIG_FILE = 'AWS_CONFIG_FILE';
+
+    public static $cacheKey;
+
+    protected static $interfaceClass;
+    protected static $exceptionClass;
+
+    /**
+     * Wraps a config provider and saves provided configuration in an
+     * instance of Aws\CacheInterface. Forwards calls when no config found
+     * in cache and updates cache with the results.
+     *
+     * @param callable $provider Configuration provider function to wrap
+     * @param CacheInterface $cache Cache to store configuration
+     * @param string|null $cacheKey (optional) Cache key to use
+     *
+     * @return callable
+     */
+    public static function cache(
+        callable $provider,
+        CacheInterface $cache,
+        $cacheKey = null
+    ) {
+        $cacheKey = $cacheKey ?: static::$cacheKey;
+
+        return function () use ($provider, $cache, $cacheKey) {
+            $found = $cache->get($cacheKey);
+            if ($found instanceof static::$interfaceClass) {
+                return Promise\Create::promiseFor($found);
+            }
+
+            return $provider()
+                ->then(function ($config) use (
+                    $cache,
+                    $cacheKey
+                ) {
+                    $cache->set($cacheKey, $config);
+                    return $config;
+                });
+        };
+    }
+
+    /**
+     * Creates an aggregate configuration provider that invokes the provided
+     * variadic providers one after the other until a provider returns
+     * configuration.
+     *
+     * @return callable
+     */
+    public static function chain()
+    {
+        $links = func_get_args();
+        if (empty($links)) {
+            throw new \InvalidArgumentException('No providers in chain');
+        }
+
+        return function () use ($links) {
+            /** @var callable $parent */
+            $parent = array_shift($links);
+            $promise = $parent();
+            while ($next = array_shift($links)) {
+                $promise = $promise->otherwise($next);
+            }
+            return $promise;
+        };
+    }
+
+    /**
+     * Gets the environment's HOME directory if available.
+     *
+     * @return null|string
+     */
+    protected static function getHomeDir()
+    {
+        // On Linux/Unix-like systems, use the HOME environment variable
+        if ($homeDir = getenv('HOME')) {
+            return $homeDir;
+        }
+
+        // Get the HOMEDRIVE and HOMEPATH values for Windows hosts
+        $homeDrive = getenv('HOMEDRIVE');
+        $homePath = getenv('HOMEPATH');
+
+        return ($homeDrive && $homePath) ? $homeDrive . $homePath : null;
+    }
+
+    /**
+     * Gets default config file location from environment, falling back to aws
+     * default location
+     *
+     * @return string
+     */
+    protected static function getDefaultConfigFilename()
+    {
+        if ($filename = getenv(self::ENV_CONFIG_FILE)) {
+            return $filename;
+        }
+        return self::getHomeDir() . '/.aws/config';
+    }
+
+    /**
+     * Wraps a config provider and caches previously provided configuration.
+     *
+     * @param callable $provider Config provider function to wrap.
+     *
+     * @return callable
+     */
+    public static function memoize(callable $provider)
+    {
+        return function () use ($provider) {
+            static $result;
+            static $isConstant;
+
+            // Constant config will be returned constantly.
+            if ($isConstant) {
+                return $result;
+            }
+
+            // Create the initial promise that will be used as the cached value
+            if (null === $result) {
+                $result = $provider();
+            }
+
+            // Return config and set flag that provider is already set
+            return $result
+                ->then(function ($config) use (&$isConstant) {
+                    $isConstant = true;
+                    return $config;
+                });
+        };
+    }
+
+    /**
+     * Reject promise with standardized exception.
+     *
+     * @param $msg
+     * @return Promise\RejectedPromise
+     */
+    protected static function reject($msg)
+    {
+        $exceptionClass = static::$exceptionClass;
+        return new Promise\RejectedPromise(new $exceptionClass($msg));
+    }
+}

+ 73 - 0
vendor/aws/aws-sdk-php/src/AccessAnalyzer/AccessAnalyzerClient.php

@@ -0,0 +1,73 @@
+<?php
+namespace Aws\AccessAnalyzer;
+
+use Aws\AwsClient;
+
+/**
+ * This client is used to interact with the **Access Analyzer** service.
+ * @method \Aws\Result applyArchiveRule(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise applyArchiveRuleAsync(array $args = [])
+ * @method \Aws\Result cancelPolicyGeneration(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise cancelPolicyGenerationAsync(array $args = [])
+ * @method \Aws\Result checkAccessNotGranted(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise checkAccessNotGrantedAsync(array $args = [])
+ * @method \Aws\Result checkNoNewAccess(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise checkNoNewAccessAsync(array $args = [])
+ * @method \Aws\Result createAccessPreview(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createAccessPreviewAsync(array $args = [])
+ * @method \Aws\Result createAnalyzer(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createAnalyzerAsync(array $args = [])
+ * @method \Aws\Result createArchiveRule(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createArchiveRuleAsync(array $args = [])
+ * @method \Aws\Result deleteAnalyzer(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteAnalyzerAsync(array $args = [])
+ * @method \Aws\Result deleteArchiveRule(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteArchiveRuleAsync(array $args = [])
+ * @method \Aws\Result getAccessPreview(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getAccessPreviewAsync(array $args = [])
+ * @method \Aws\Result getAnalyzedResource(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getAnalyzedResourceAsync(array $args = [])
+ * @method \Aws\Result getAnalyzer(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getAnalyzerAsync(array $args = [])
+ * @method \Aws\Result getArchiveRule(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getArchiveRuleAsync(array $args = [])
+ * @method \Aws\Result getFinding(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getFindingAsync(array $args = [])
+ * @method \Aws\Result getFindingV2(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getFindingV2Async(array $args = [])
+ * @method \Aws\Result getGeneratedPolicy(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getGeneratedPolicyAsync(array $args = [])
+ * @method \Aws\Result listAccessPreviewFindings(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listAccessPreviewFindingsAsync(array $args = [])
+ * @method \Aws\Result listAccessPreviews(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listAccessPreviewsAsync(array $args = [])
+ * @method \Aws\Result listAnalyzedResources(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listAnalyzedResourcesAsync(array $args = [])
+ * @method \Aws\Result listAnalyzers(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listAnalyzersAsync(array $args = [])
+ * @method \Aws\Result listArchiveRules(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listArchiveRulesAsync(array $args = [])
+ * @method \Aws\Result listFindings(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listFindingsAsync(array $args = [])
+ * @method \Aws\Result listFindingsV2(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listFindingsV2Async(array $args = [])
+ * @method \Aws\Result listPolicyGenerations(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listPolicyGenerationsAsync(array $args = [])
+ * @method \Aws\Result listTagsForResource(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listTagsForResourceAsync(array $args = [])
+ * @method \Aws\Result startPolicyGeneration(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise startPolicyGenerationAsync(array $args = [])
+ * @method \Aws\Result startResourceScan(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise startResourceScanAsync(array $args = [])
+ * @method \Aws\Result tagResource(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise tagResourceAsync(array $args = [])
+ * @method \Aws\Result untagResource(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise untagResourceAsync(array $args = [])
+ * @method \Aws\Result updateArchiveRule(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateArchiveRuleAsync(array $args = [])
+ * @method \Aws\Result updateFindings(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateFindingsAsync(array $args = [])
+ * @method \Aws\Result validatePolicy(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise validatePolicyAsync(array $args = [])
+ */
+class AccessAnalyzerClient extends AwsClient {}

+ 9 - 0
vendor/aws/aws-sdk-php/src/AccessAnalyzer/Exception/AccessAnalyzerException.php

@@ -0,0 +1,9 @@
+<?php
+namespace Aws\AccessAnalyzer\Exception;
+
+use Aws\Exception\AwsException;
+
+/**
+ * Represents an error interacting with the **Access Analyzer** service.
+ */
+class AccessAnalyzerException extends AwsException {}

+ 27 - 0
vendor/aws/aws-sdk-php/src/Account/AccountClient.php

@@ -0,0 +1,27 @@
+<?php
+namespace Aws\Account;
+
+use Aws\AwsClient;
+
+/**
+ * This client is used to interact with the **AWS Account** service.
+ * @method \Aws\Result deleteAlternateContact(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteAlternateContactAsync(array $args = [])
+ * @method \Aws\Result disableRegion(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise disableRegionAsync(array $args = [])
+ * @method \Aws\Result enableRegion(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise enableRegionAsync(array $args = [])
+ * @method \Aws\Result getAlternateContact(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getAlternateContactAsync(array $args = [])
+ * @method \Aws\Result getContactInformation(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getContactInformationAsync(array $args = [])
+ * @method \Aws\Result getRegionOptStatus(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getRegionOptStatusAsync(array $args = [])
+ * @method \Aws\Result listRegions(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listRegionsAsync(array $args = [])
+ * @method \Aws\Result putAlternateContact(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise putAlternateContactAsync(array $args = [])
+ * @method \Aws\Result putContactInformation(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise putContactInformationAsync(array $args = [])
+ */
+class AccountClient extends AwsClient {}

+ 9 - 0
vendor/aws/aws-sdk-php/src/Account/Exception/AccountException.php

@@ -0,0 +1,9 @@
+<?php
+namespace Aws\Account\Exception;
+
+use Aws\Exception\AwsException;
+
+/**
+ * Represents an error interacting with the **AWS Account** service.
+ */
+class AccountException extends AwsException {}

+ 40 - 0
vendor/aws/aws-sdk-php/src/Acm/AcmClient.php

@@ -0,0 +1,40 @@
+<?php
+namespace Aws\Acm;
+
+use Aws\AwsClient;
+
+/**
+ * This client is used to interact with the **AWS Certificate Manager** service.
+ *
+ * @method \Aws\Result addTagsToCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise addTagsToCertificateAsync(array $args = [])
+ * @method \Aws\Result deleteCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteCertificateAsync(array $args = [])
+ * @method \Aws\Result describeCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise describeCertificateAsync(array $args = [])
+ * @method \Aws\Result exportCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise exportCertificateAsync(array $args = [])
+ * @method \Aws\Result getAccountConfiguration(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getAccountConfigurationAsync(array $args = [])
+ * @method \Aws\Result getCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getCertificateAsync(array $args = [])
+ * @method \Aws\Result importCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise importCertificateAsync(array $args = [])
+ * @method \Aws\Result listCertificates(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listCertificatesAsync(array $args = [])
+ * @method \Aws\Result listTagsForCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listTagsForCertificateAsync(array $args = [])
+ * @method \Aws\Result putAccountConfiguration(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise putAccountConfigurationAsync(array $args = [])
+ * @method \Aws\Result removeTagsFromCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise removeTagsFromCertificateAsync(array $args = [])
+ * @method \Aws\Result renewCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise renewCertificateAsync(array $args = [])
+ * @method \Aws\Result requestCertificate(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise requestCertificateAsync(array $args = [])
+ * @method \Aws\Result resendValidationEmail(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise resendValidationEmailAsync(array $args = [])
+ * @method \Aws\Result updateCertificateOptions(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateCertificateOptionsAsync(array $args = [])
+ */
+class AcmClient extends AwsClient {}

+ 9 - 0
vendor/aws/aws-sdk-php/src/Acm/Exception/AcmException.php

@@ -0,0 +1,9 @@
+<?php
+namespace Aws\Acm\Exception;
+
+use Aws\Exception\AwsException;
+
+/**
+ * Represents an error interacting with the **AWS Certificate Manager** service.
+ */
+class AcmException extends AwsException {}

+ 195 - 0
vendor/aws/aws-sdk-php/src/AlexaForBusiness/AlexaForBusinessClient.php

@@ -0,0 +1,195 @@
+<?php
+namespace Aws\AlexaForBusiness;
+
+use Aws\AwsClient;
+
+/**
+ * This client is used to interact with the **Alexa For Business** service.
+ * @method \Aws\Result approveSkill(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise approveSkillAsync(array $args = [])
+ * @method \Aws\Result associateContactWithAddressBook(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise associateContactWithAddressBookAsync(array $args = [])
+ * @method \Aws\Result associateDeviceWithNetworkProfile(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise associateDeviceWithNetworkProfileAsync(array $args = [])
+ * @method \Aws\Result associateDeviceWithRoom(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise associateDeviceWithRoomAsync(array $args = [])
+ * @method \Aws\Result associateSkillGroupWithRoom(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise associateSkillGroupWithRoomAsync(array $args = [])
+ * @method \Aws\Result associateSkillWithSkillGroup(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise associateSkillWithSkillGroupAsync(array $args = [])
+ * @method \Aws\Result associateSkillWithUsers(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise associateSkillWithUsersAsync(array $args = [])
+ * @method \Aws\Result createAddressBook(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createAddressBookAsync(array $args = [])
+ * @method \Aws\Result createBusinessReportSchedule(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createBusinessReportScheduleAsync(array $args = [])
+ * @method \Aws\Result createConferenceProvider(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createConferenceProviderAsync(array $args = [])
+ * @method \Aws\Result createContact(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createContactAsync(array $args = [])
+ * @method \Aws\Result createGatewayGroup(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createGatewayGroupAsync(array $args = [])
+ * @method \Aws\Result createNetworkProfile(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createNetworkProfileAsync(array $args = [])
+ * @method \Aws\Result createProfile(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createProfileAsync(array $args = [])
+ * @method \Aws\Result createRoom(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createRoomAsync(array $args = [])
+ * @method \Aws\Result createSkillGroup(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createSkillGroupAsync(array $args = [])
+ * @method \Aws\Result createUser(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createUserAsync(array $args = [])
+ * @method \Aws\Result deleteAddressBook(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteAddressBookAsync(array $args = [])
+ * @method \Aws\Result deleteBusinessReportSchedule(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteBusinessReportScheduleAsync(array $args = [])
+ * @method \Aws\Result deleteConferenceProvider(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteConferenceProviderAsync(array $args = [])
+ * @method \Aws\Result deleteContact(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteContactAsync(array $args = [])
+ * @method \Aws\Result deleteDevice(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteDeviceAsync(array $args = [])
+ * @method \Aws\Result deleteDeviceUsageData(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteDeviceUsageDataAsync(array $args = [])
+ * @method \Aws\Result deleteGatewayGroup(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteGatewayGroupAsync(array $args = [])
+ * @method \Aws\Result deleteNetworkProfile(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteNetworkProfileAsync(array $args = [])
+ * @method \Aws\Result deleteProfile(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteProfileAsync(array $args = [])
+ * @method \Aws\Result deleteRoom(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteRoomAsync(array $args = [])
+ * @method \Aws\Result deleteRoomSkillParameter(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteRoomSkillParameterAsync(array $args = [])
+ * @method \Aws\Result deleteSkillAuthorization(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteSkillAuthorizationAsync(array $args = [])
+ * @method \Aws\Result deleteSkillGroup(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteSkillGroupAsync(array $args = [])
+ * @method \Aws\Result deleteUser(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteUserAsync(array $args = [])
+ * @method \Aws\Result disassociateContactFromAddressBook(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise disassociateContactFromAddressBookAsync(array $args = [])
+ * @method \Aws\Result disassociateDeviceFromRoom(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise disassociateDeviceFromRoomAsync(array $args = [])
+ * @method \Aws\Result disassociateSkillFromSkillGroup(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise disassociateSkillFromSkillGroupAsync(array $args = [])
+ * @method \Aws\Result disassociateSkillFromUsers(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise disassociateSkillFromUsersAsync(array $args = [])
+ * @method \Aws\Result disassociateSkillGroupFromRoom(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise disassociateSkillGroupFromRoomAsync(array $args = [])
+ * @method \Aws\Result forgetSmartHomeAppliances(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise forgetSmartHomeAppliancesAsync(array $args = [])
+ * @method \Aws\Result getAddressBook(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getAddressBookAsync(array $args = [])
+ * @method \Aws\Result getConferencePreference(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getConferencePreferenceAsync(array $args = [])
+ * @method \Aws\Result getConferenceProvider(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getConferenceProviderAsync(array $args = [])
+ * @method \Aws\Result getContact(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getContactAsync(array $args = [])
+ * @method \Aws\Result getDevice(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getDeviceAsync(array $args = [])
+ * @method \Aws\Result getGateway(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getGatewayAsync(array $args = [])
+ * @method \Aws\Result getGatewayGroup(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getGatewayGroupAsync(array $args = [])
+ * @method \Aws\Result getInvitationConfiguration(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getInvitationConfigurationAsync(array $args = [])
+ * @method \Aws\Result getNetworkProfile(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getNetworkProfileAsync(array $args = [])
+ * @method \Aws\Result getProfile(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getProfileAsync(array $args = [])
+ * @method \Aws\Result getRoom(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getRoomAsync(array $args = [])
+ * @method \Aws\Result getRoomSkillParameter(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getRoomSkillParameterAsync(array $args = [])
+ * @method \Aws\Result getSkillGroup(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getSkillGroupAsync(array $args = [])
+ * @method \Aws\Result listBusinessReportSchedules(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listBusinessReportSchedulesAsync(array $args = [])
+ * @method \Aws\Result listConferenceProviders(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listConferenceProvidersAsync(array $args = [])
+ * @method \Aws\Result listDeviceEvents(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listDeviceEventsAsync(array $args = [])
+ * @method \Aws\Result listGatewayGroups(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listGatewayGroupsAsync(array $args = [])
+ * @method \Aws\Result listGateways(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listGatewaysAsync(array $args = [])
+ * @method \Aws\Result listSkills(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listSkillsAsync(array $args = [])
+ * @method \Aws\Result listSkillsStoreCategories(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listSkillsStoreCategoriesAsync(array $args = [])
+ * @method \Aws\Result listSkillsStoreSkillsByCategory(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listSkillsStoreSkillsByCategoryAsync(array $args = [])
+ * @method \Aws\Result listSmartHomeAppliances(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listSmartHomeAppliancesAsync(array $args = [])
+ * @method \Aws\Result listTags(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listTagsAsync(array $args = [])
+ * @method \Aws\Result putConferencePreference(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise putConferencePreferenceAsync(array $args = [])
+ * @method \Aws\Result putInvitationConfiguration(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise putInvitationConfigurationAsync(array $args = [])
+ * @method \Aws\Result putRoomSkillParameter(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise putRoomSkillParameterAsync(array $args = [])
+ * @method \Aws\Result putSkillAuthorization(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise putSkillAuthorizationAsync(array $args = [])
+ * @method \Aws\Result registerAVSDevice(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise registerAVSDeviceAsync(array $args = [])
+ * @method \Aws\Result rejectSkill(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise rejectSkillAsync(array $args = [])
+ * @method \Aws\Result resolveRoom(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise resolveRoomAsync(array $args = [])
+ * @method \Aws\Result revokeInvitation(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise revokeInvitationAsync(array $args = [])
+ * @method \Aws\Result searchAddressBooks(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise searchAddressBooksAsync(array $args = [])
+ * @method \Aws\Result searchContacts(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise searchContactsAsync(array $args = [])
+ * @method \Aws\Result searchDevices(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise searchDevicesAsync(array $args = [])
+ * @method \Aws\Result searchNetworkProfiles(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise searchNetworkProfilesAsync(array $args = [])
+ * @method \Aws\Result searchProfiles(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise searchProfilesAsync(array $args = [])
+ * @method \Aws\Result searchRooms(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise searchRoomsAsync(array $args = [])
+ * @method \Aws\Result searchSkillGroups(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise searchSkillGroupsAsync(array $args = [])
+ * @method \Aws\Result searchUsers(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise searchUsersAsync(array $args = [])
+ * @method \Aws\Result sendAnnouncement(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise sendAnnouncementAsync(array $args = [])
+ * @method \Aws\Result sendInvitation(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise sendInvitationAsync(array $args = [])
+ * @method \Aws\Result startDeviceSync(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise startDeviceSyncAsync(array $args = [])
+ * @method \Aws\Result startSmartHomeApplianceDiscovery(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise startSmartHomeApplianceDiscoveryAsync(array $args = [])
+ * @method \Aws\Result tagResource(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise tagResourceAsync(array $args = [])
+ * @method \Aws\Result untagResource(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise untagResourceAsync(array $args = [])
+ * @method \Aws\Result updateAddressBook(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateAddressBookAsync(array $args = [])
+ * @method \Aws\Result updateBusinessReportSchedule(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateBusinessReportScheduleAsync(array $args = [])
+ * @method \Aws\Result updateConferenceProvider(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateConferenceProviderAsync(array $args = [])
+ * @method \Aws\Result updateContact(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateContactAsync(array $args = [])
+ * @method \Aws\Result updateDevice(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateDeviceAsync(array $args = [])
+ * @method \Aws\Result updateGateway(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateGatewayAsync(array $args = [])
+ * @method \Aws\Result updateGatewayGroup(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateGatewayGroupAsync(array $args = [])
+ * @method \Aws\Result updateNetworkProfile(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateNetworkProfileAsync(array $args = [])
+ * @method \Aws\Result updateProfile(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateProfileAsync(array $args = [])
+ * @method \Aws\Result updateRoom(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateRoomAsync(array $args = [])
+ * @method \Aws\Result updateSkillGroup(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateSkillGroupAsync(array $args = [])
+ */
+class AlexaForBusinessClient extends AwsClient {}

+ 9 - 0
vendor/aws/aws-sdk-php/src/AlexaForBusiness/Exception/AlexaForBusinessException.php

@@ -0,0 +1,9 @@
+<?php
+namespace Aws\AlexaForBusiness\Exception;
+
+use Aws\Exception\AwsException;
+
+/**
+ * Represents an error interacting with the **Alexa For Business** service.
+ */
+class AlexaForBusinessException extends AwsException {}

+ 83 - 0
vendor/aws/aws-sdk-php/src/Amplify/AmplifyClient.php

@@ -0,0 +1,83 @@
+<?php
+namespace Aws\Amplify;
+
+use Aws\AwsClient;
+
+/**
+ * This client is used to interact with the **AWS Amplify** service.
+ * @method \Aws\Result createApp(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createAppAsync(array $args = [])
+ * @method \Aws\Result createBackendEnvironment(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createBackendEnvironmentAsync(array $args = [])
+ * @method \Aws\Result createBranch(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createBranchAsync(array $args = [])
+ * @method \Aws\Result createDeployment(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createDeploymentAsync(array $args = [])
+ * @method \Aws\Result createDomainAssociation(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createDomainAssociationAsync(array $args = [])
+ * @method \Aws\Result createWebhook(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createWebhookAsync(array $args = [])
+ * @method \Aws\Result deleteApp(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteAppAsync(array $args = [])
+ * @method \Aws\Result deleteBackendEnvironment(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteBackendEnvironmentAsync(array $args = [])
+ * @method \Aws\Result deleteBranch(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteBranchAsync(array $args = [])
+ * @method \Aws\Result deleteDomainAssociation(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteDomainAssociationAsync(array $args = [])
+ * @method \Aws\Result deleteJob(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteJobAsync(array $args = [])
+ * @method \Aws\Result deleteWebhook(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteWebhookAsync(array $args = [])
+ * @method \Aws\Result generateAccessLogs(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise generateAccessLogsAsync(array $args = [])
+ * @method \Aws\Result getApp(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getAppAsync(array $args = [])
+ * @method \Aws\Result getArtifactUrl(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getArtifactUrlAsync(array $args = [])
+ * @method \Aws\Result getBackendEnvironment(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getBackendEnvironmentAsync(array $args = [])
+ * @method \Aws\Result getBranch(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getBranchAsync(array $args = [])
+ * @method \Aws\Result getDomainAssociation(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getDomainAssociationAsync(array $args = [])
+ * @method \Aws\Result getJob(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getJobAsync(array $args = [])
+ * @method \Aws\Result getWebhook(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getWebhookAsync(array $args = [])
+ * @method \Aws\Result listApps(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listAppsAsync(array $args = [])
+ * @method \Aws\Result listArtifacts(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listArtifactsAsync(array $args = [])
+ * @method \Aws\Result listBackendEnvironments(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listBackendEnvironmentsAsync(array $args = [])
+ * @method \Aws\Result listBranches(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listBranchesAsync(array $args = [])
+ * @method \Aws\Result listDomainAssociations(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listDomainAssociationsAsync(array $args = [])
+ * @method \Aws\Result listJobs(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listJobsAsync(array $args = [])
+ * @method \Aws\Result listTagsForResource(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listTagsForResourceAsync(array $args = [])
+ * @method \Aws\Result listWebhooks(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listWebhooksAsync(array $args = [])
+ * @method \Aws\Result startDeployment(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise startDeploymentAsync(array $args = [])
+ * @method \Aws\Result startJob(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise startJobAsync(array $args = [])
+ * @method \Aws\Result stopJob(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise stopJobAsync(array $args = [])
+ * @method \Aws\Result tagResource(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise tagResourceAsync(array $args = [])
+ * @method \Aws\Result untagResource(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise untagResourceAsync(array $args = [])
+ * @method \Aws\Result updateApp(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateAppAsync(array $args = [])
+ * @method \Aws\Result updateBranch(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateBranchAsync(array $args = [])
+ * @method \Aws\Result updateDomainAssociation(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateDomainAssociationAsync(array $args = [])
+ * @method \Aws\Result updateWebhook(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateWebhookAsync(array $args = [])
+ */
+class AmplifyClient extends AwsClient {}

+ 9 - 0
vendor/aws/aws-sdk-php/src/Amplify/Exception/AmplifyException.php

@@ -0,0 +1,9 @@
+<?php
+namespace Aws\Amplify\Exception;
+
+use Aws\Exception\AwsException;
+
+/**
+ * Represents an error interacting with the **AWS Amplify** service.
+ */
+class AmplifyException extends AwsException {}

+ 71 - 0
vendor/aws/aws-sdk-php/src/AmplifyBackend/AmplifyBackendClient.php

@@ -0,0 +1,71 @@
+<?php
+namespace Aws\AmplifyBackend;
+
+use Aws\AwsClient;
+
+/**
+ * This client is used to interact with the **AmplifyBackend** service.
+ * @method \Aws\Result cloneBackend(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise cloneBackendAsync(array $args = [])
+ * @method \Aws\Result createBackend(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createBackendAsync(array $args = [])
+ * @method \Aws\Result createBackendAPI(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createBackendAPIAsync(array $args = [])
+ * @method \Aws\Result createBackendAuth(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createBackendAuthAsync(array $args = [])
+ * @method \Aws\Result createBackendConfig(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createBackendConfigAsync(array $args = [])
+ * @method \Aws\Result createBackendStorage(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createBackendStorageAsync(array $args = [])
+ * @method \Aws\Result createToken(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createTokenAsync(array $args = [])
+ * @method \Aws\Result deleteBackend(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteBackendAsync(array $args = [])
+ * @method \Aws\Result deleteBackendAPI(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteBackendAPIAsync(array $args = [])
+ * @method \Aws\Result deleteBackendAuth(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteBackendAuthAsync(array $args = [])
+ * @method \Aws\Result deleteBackendStorage(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteBackendStorageAsync(array $args = [])
+ * @method \Aws\Result deleteToken(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteTokenAsync(array $args = [])
+ * @method \Aws\Result generateBackendAPIModels(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise generateBackendAPIModelsAsync(array $args = [])
+ * @method \Aws\Result getBackend(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getBackendAsync(array $args = [])
+ * @method \Aws\Result getBackendAPI(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getBackendAPIAsync(array $args = [])
+ * @method \Aws\Result getBackendAPIModels(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getBackendAPIModelsAsync(array $args = [])
+ * @method \Aws\Result getBackendAuth(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getBackendAuthAsync(array $args = [])
+ * @method \Aws\Result getBackendJob(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getBackendJobAsync(array $args = [])
+ * @method \Aws\Result getBackendStorage(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getBackendStorageAsync(array $args = [])
+ * @method \Aws\Result getToken(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getTokenAsync(array $args = [])
+ * @method \Aws\Result importBackendAuth(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise importBackendAuthAsync(array $args = [])
+ * @method \Aws\Result importBackendStorage(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise importBackendStorageAsync(array $args = [])
+ * @method \Aws\Result listBackendJobs(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listBackendJobsAsync(array $args = [])
+ * @method \Aws\Result listS3Buckets(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listS3BucketsAsync(array $args = [])
+ * @method \Aws\Result removeAllBackends(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise removeAllBackendsAsync(array $args = [])
+ * @method \Aws\Result removeBackendConfig(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise removeBackendConfigAsync(array $args = [])
+ * @method \Aws\Result updateBackendAPI(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateBackendAPIAsync(array $args = [])
+ * @method \Aws\Result updateBackendAuth(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateBackendAuthAsync(array $args = [])
+ * @method \Aws\Result updateBackendConfig(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateBackendConfigAsync(array $args = [])
+ * @method \Aws\Result updateBackendJob(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateBackendJobAsync(array $args = [])
+ * @method \Aws\Result updateBackendStorage(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateBackendStorageAsync(array $args = [])
+ */
+class AmplifyBackendClient extends AwsClient {}

+ 9 - 0
vendor/aws/aws-sdk-php/src/AmplifyBackend/Exception/AmplifyBackendException.php

@@ -0,0 +1,9 @@
+<?php
+namespace Aws\AmplifyBackend\Exception;
+
+use Aws\Exception\AwsException;
+
+/**
+ * Represents an error interacting with the **AmplifyBackend** service.
+ */
+class AmplifyBackendException extends AwsException {}

+ 59 - 0
vendor/aws/aws-sdk-php/src/AmplifyUIBuilder/AmplifyUIBuilderClient.php

@@ -0,0 +1,59 @@
+<?php
+namespace Aws\AmplifyUIBuilder;
+
+use Aws\AwsClient;
+
+/**
+ * This client is used to interact with the **AWS Amplify UI Builder** service.
+ * @method \Aws\Result createComponent(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createComponentAsync(array $args = [])
+ * @method \Aws\Result createForm(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createFormAsync(array $args = [])
+ * @method \Aws\Result createTheme(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise createThemeAsync(array $args = [])
+ * @method \Aws\Result deleteComponent(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteComponentAsync(array $args = [])
+ * @method \Aws\Result deleteForm(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteFormAsync(array $args = [])
+ * @method \Aws\Result deleteTheme(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise deleteThemeAsync(array $args = [])
+ * @method \Aws\Result exchangeCodeForToken(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise exchangeCodeForTokenAsync(array $args = [])
+ * @method \Aws\Result exportComponents(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise exportComponentsAsync(array $args = [])
+ * @method \Aws\Result exportForms(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise exportFormsAsync(array $args = [])
+ * @method \Aws\Result exportThemes(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise exportThemesAsync(array $args = [])
+ * @method \Aws\Result getCodegenJob(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getCodegenJobAsync(array $args = [])
+ * @method \Aws\Result getComponent(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getComponentAsync(array $args = [])
+ * @method \Aws\Result getForm(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getFormAsync(array $args = [])
+ * @method \Aws\Result getMetadata(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getMetadataAsync(array $args = [])
+ * @method \Aws\Result getTheme(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise getThemeAsync(array $args = [])
+ * @method \Aws\Result listCodegenJobs(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listCodegenJobsAsync(array $args = [])
+ * @method \Aws\Result listComponents(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listComponentsAsync(array $args = [])
+ * @method \Aws\Result listForms(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listFormsAsync(array $args = [])
+ * @method \Aws\Result listThemes(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise listThemesAsync(array $args = [])
+ * @method \Aws\Result putMetadataFlag(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise putMetadataFlagAsync(array $args = [])
+ * @method \Aws\Result refreshToken(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise refreshTokenAsync(array $args = [])
+ * @method \Aws\Result startCodegenJob(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise startCodegenJobAsync(array $args = [])
+ * @method \Aws\Result updateComponent(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateComponentAsync(array $args = [])
+ * @method \Aws\Result updateForm(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateFormAsync(array $args = [])
+ * @method \Aws\Result updateTheme(array $args = [])
+ * @method \GuzzleHttp\Promise\Promise updateThemeAsync(array $args = [])
+ */
+class AmplifyUIBuilderClient extends AwsClient {}

+ 9 - 0
vendor/aws/aws-sdk-php/src/AmplifyUIBuilder/Exception/AmplifyUIBuilderException.php

@@ -0,0 +1,9 @@
+<?php
+namespace Aws\AmplifyUIBuilder\Exception;
+
+use Aws\Exception\AwsException;
+
+/**
+ * Represents an error interacting with the **AWS Amplify UI Builder** service.
+ */
+class AmplifyUIBuilderException extends AwsException {}

+ 89 - 0
vendor/aws/aws-sdk-php/src/Api/AbstractModel.php

@@ -0,0 +1,89 @@
+<?php
+namespace Aws\Api;
+
+/**
+ * Base class that is used by most API shapes
+ */
+abstract class AbstractModel implements \ArrayAccess
+{
+    /** @var array */
+    protected $definition;
+
+    /** @var ShapeMap */
+    protected $shapeMap;
+
+    /** @var array */
+    protected $contextParam;
+
+    /**
+     * @param array    $definition Service description
+     * @param ShapeMap $shapeMap   Shapemap used for creating shapes
+     */
+    public function __construct(array $definition, ShapeMap $shapeMap)
+    {
+        $this->definition = $definition;
+        $this->shapeMap = $shapeMap;
+        if (isset($definition['contextParam'])) {
+            $this->contextParam = $definition['contextParam'];
+        }
+    }
+
+    public function toArray()
+    {
+        return $this->definition;
+    }
+
+    /**
+     * @return mixed|null
+     */
+    #[\ReturnTypeWillChange]
+    public function offsetGet($offset)
+    {
+        return isset($this->definition[$offset])
+            ? $this->definition[$offset] : null;
+    }
+
+    /**
+     * @return void
+     */
+    #[\ReturnTypeWillChange]
+    public function offsetSet($offset, $value)
+    {
+        $this->definition[$offset] = $value;
+    }
+
+    /**
+     * @return bool
+     */
+    #[\ReturnTypeWillChange]
+    public function offsetExists($offset)
+    {
+        return isset($this->definition[$offset]);
+    }
+
+    /**
+     * @return void
+     */
+    #[\ReturnTypeWillChange]
+    public function offsetUnset($offset)
+    {
+        unset($this->definition[$offset]);
+    }
+
+    protected function shapeAt($key)
+    {
+        if (!isset($this->definition[$key])) {
+            throw new \InvalidArgumentException('Expected shape definition at '
+                . $key);
+        }
+
+        return $this->shapeFor($this->definition[$key]);
+    }
+
+    protected function shapeFor(array $definition)
+    {
+        return isset($definition['shape'])
+            ? $this->shapeMap->resolve($definition)
+            : Shape::create($definition, $this->shapeMap);
+    }
+}

+ 244 - 0
vendor/aws/aws-sdk-php/src/Api/ApiProvider.php

@@ -0,0 +1,244 @@
+<?php
+namespace Aws\Api;
+
+use Aws\Exception\UnresolvedApiException;
+
+/**
+ * API providers.
+ *
+ * An API provider is a function that accepts a type, service, and version and
+ * returns an array of API data on success or NULL if no API data can be created
+ * for the provided arguments.
+ *
+ * You can wrap your calls to an API provider with the
+ * {@see ApiProvider::resolve} method to ensure that API data is created. If the
+ * API data is not created, then the resolve() method will throw a
+ * {@see Aws\Exception\UnresolvedApiException}.
+ *
+ *     use Aws\Api\ApiProvider;
+ *     $provider = ApiProvider::defaultProvider();
+ *     // Returns an array or NULL.
+ *     $data = $provider('api', 's3', '2006-03-01');
+ *     // Returns an array or throws.
+ *     $data = ApiProvider::resolve($provider, 'api', 'elasticfood', '2020-01-01');
+ *
+ * You can compose multiple providers into a single provider using
+ * {@see Aws\or_chain}. This method accepts providers as arguments and
+ * returns a new function that will invoke each provider until a non-null value
+ * is returned.
+ *
+ *     $a = ApiProvider::filesystem(sys_get_temp_dir() . '/aws-beta-models');
+ *     $b = ApiProvider::manifest();
+ *
+ *     $c = \Aws\or_chain($a, $b);
+ *     $data = $c('api', 'betaservice', '2015-08-08'); // $a handles this.
+ *     $data = $c('api', 's3', '2006-03-01');          // $b handles this.
+ *     $data = $c('api', 'invalid', '2014-12-15');     // Neither handles this.
+ */
+class ApiProvider
+{
+    /** @var array A map of public API type names to their file suffix. */
+    private static $typeMap = [
+        'api'       => 'api-2',
+        'paginator' => 'paginators-1',
+        'waiter'    => 'waiters-2',
+        'docs'      => 'docs-2',
+    ];
+
+    /** @var array API manifest */
+    private $manifest;
+
+    /** @var string The directory containing service models. */
+    private $modelsDir;
+
+    /**
+     * Resolves an API provider and ensures a non-null return value.
+     *
+     * @param callable $provider Provider function to invoke.
+     * @param string   $type     Type of data ('api', 'waiter', 'paginator').
+     * @param string   $service  Service name.
+     * @param string   $version  API version.
+     *
+     * @return array
+     * @throws UnresolvedApiException
+     */
+    public static function resolve(callable $provider, $type, $service, $version)
+    {
+        // Execute the provider and return the result, if there is one.
+        $result = $provider($type, $service, $version);
+        if (is_array($result)) {
+            if (!isset($result['metadata']['serviceIdentifier'])) {
+                $result['metadata']['serviceIdentifier'] = $service;
+            }
+            return $result;
+        }
+
+        // Throw an exception with a message depending on the inputs.
+        if (!isset(self::$typeMap[$type])) {
+            $msg = "The type must be one of: " . implode(', ', self::$typeMap);
+        } elseif ($service) {
+            $msg = "The {$service} service does not have version: {$version}.";
+        } else {
+            $msg = "You must specify a service name to retrieve its API data.";
+        }
+
+        throw new UnresolvedApiException($msg);
+    }
+
+    /**
+     * Default SDK API provider.
+     *
+     * This provider loads pre-built manifest data from the `data` directory.
+     *
+     * @return self
+     */
+    public static function defaultProvider()
+    {
+        return new self(__DIR__ . '/../data', \Aws\manifest());
+    }
+
+    /**
+     * Loads API data after resolving the version to the latest, compatible,
+     * available version based on the provided manifest data.
+     *
+     * Manifest data is essentially an associative array of service names to
+     * associative arrays of API version aliases.
+     *
+     * [
+     *   ...
+     *   'ec2' => [
+     *     'latest'     => '2014-10-01',
+     *     '2014-10-01' => '2014-10-01',
+     *     '2014-09-01' => '2014-10-01',
+     *     '2014-06-15' => '2014-10-01',
+     *     ...
+     *   ],
+     *   'ecs' => [...],
+     *   'elasticache' => [...],
+     *   ...
+     * ]
+     *
+     * @param string $dir      Directory containing service models.
+     * @param array  $manifest The API version manifest data.
+     *
+     * @return self
+     */
+    public static function manifest($dir, array $manifest)
+    {
+        return new self($dir, $manifest);
+    }
+
+    /**
+     * Loads API data from the specified directory.
+     *
+     * If "latest" is specified as the version, this provider must glob the
+     * directory to find which is the latest available version.
+     *
+     * @param string $dir Directory containing service models.
+     *
+     * @return self
+     * @throws \InvalidArgumentException if the provided `$dir` is invalid.
+     */
+    public static function filesystem($dir)
+    {
+        return new self($dir);
+    }
+
+    /**
+     * Retrieves a list of valid versions for the specified service.
+     *
+     * @param string $service Service name
+     *
+     * @return array
+     */
+    public function getVersions($service)
+    {
+        if (!isset($this->manifest)) {
+            $this->buildVersionsList($service);
+        }
+
+        if (!isset($this->manifest[$service]['versions'])) {
+            return [];
+        }
+
+        return array_values(array_unique($this->manifest[$service]['versions']));
+    }
+
+    /**
+     * Execute the provider.
+     *
+     * @param string $type    Type of data ('api', 'waiter', 'paginator').
+     * @param string $service Service name.
+     * @param string $version API version.
+     *
+     * @return array|null
+     */
+    public function __invoke($type, $service, $version)
+    {
+        // Resolve the type or return null.
+        if (isset(self::$typeMap[$type])) {
+            $type = self::$typeMap[$type];
+        } else {
+            return null;
+        }
+
+        // Resolve the version or return null.
+        if (!isset($this->manifest)) {
+            $this->buildVersionsList($service);
+        }
+
+        if (!isset($this->manifest[$service]['versions'][$version])) {
+            return null;
+        }
+
+        $version = $this->manifest[$service]['versions'][$version];
+        $path = "{$this->modelsDir}/{$service}/{$version}/{$type}.json";
+
+        try {
+            return \Aws\load_compiled_json($path);
+        } catch (\InvalidArgumentException $e) {
+            return null;
+        }
+    }
+
+    /**
+     * @param string $modelsDir Directory containing service models.
+     * @param array  $manifest  The API version manifest data.
+     */
+    private function __construct($modelsDir, array $manifest = null)
+    {
+        $this->manifest = $manifest;
+        $this->modelsDir = rtrim($modelsDir, '/');
+        if (!is_dir($this->modelsDir)) {
+            throw new \InvalidArgumentException(
+                "The specified models directory, {$modelsDir}, was not found."
+            );
+        }
+    }
+
+    /**
+     * Build the versions list for the specified service by globbing the dir.
+     */
+    private function buildVersionsList($service)
+    {
+        $dir = "{$this->modelsDir}/{$service}/";
+
+        if (!is_dir($dir)) {
+            return;
+        }
+
+        // Get versions, remove . and .., and sort in descending order.
+        $results = array_diff(scandir($dir, SCANDIR_SORT_DESCENDING), ['..', '.']);
+
+        if (!$results) {
+            $this->manifest[$service] = ['versions' => []];
+        } else {
+            $this->manifest[$service] = [
+                'versions' => [
+                    'latest' => $results[0]
+                ]
+            ];
+            $this->manifest[$service]['versions'] += array_combine($results, $results);
+        }
+    }
+}

+ 124 - 0
vendor/aws/aws-sdk-php/src/Api/DateTimeResult.php

@@ -0,0 +1,124 @@
+<?php
+
+namespace Aws\Api;
+
+use Aws\Api\Parser\Exception\ParserException;
+use DateTime;
+use DateTimeZone;
+use Exception;
+
+/**
+ * DateTime overrides that make DateTime work more seamlessly as a string,
+ * with JSON documents, and with JMESPath.
+ */
+class DateTimeResult extends \DateTime implements \JsonSerializable
+{
+    /**
+     * Create a new DateTimeResult from a unix timestamp.
+     * The Unix epoch (or Unix time or POSIX time or Unix
+     * timestamp) is the number of seconds that have elapsed since
+     * January 1, 1970 (midnight UTC/GMT).
+     *
+     * @return DateTimeResult
+     * @throws Exception
+     */
+    public static function fromEpoch($unixTimestamp)
+    {
+        if (!is_numeric($unixTimestamp)) {
+            throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromEpoch');
+        }
+
+        // PHP 5.5 does not support sub-second precision
+        if (\PHP_VERSION_ID < 56000) {
+            return new self(gmdate('c', $unixTimestamp));
+        }
+
+        $decimalSeparator = isset(localeconv()['decimal_point']) ? localeconv()['decimal_point'] : ".";
+        $formatString = "U" . $decimalSeparator . "u";
+        $dateTime = DateTime::createFromFormat(
+            $formatString,
+            sprintf('%0.6f', $unixTimestamp),
+            new DateTimeZone('UTC')
+        );
+
+        if (false === $dateTime) {
+            throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromEpoch');
+        }
+
+        return new self(
+            $dateTime->format('Y-m-d H:i:s.u'),
+            new DateTimeZone('UTC')
+        );
+    }
+
+    /**
+     * @return DateTimeResult
+     */
+    public static function fromISO8601($iso8601Timestamp)
+    {
+        if (is_numeric($iso8601Timestamp) || !is_string($iso8601Timestamp)) {
+            throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromISO8601');
+        }
+
+        return new DateTimeResult($iso8601Timestamp);
+    }
+
+    /**
+     * Create a new DateTimeResult from an unknown timestamp.
+     *
+     * @return DateTimeResult
+     * @throws Exception
+     */
+    public static function fromTimestamp($timestamp, $expectedFormat = null)
+    {
+        if (empty($timestamp)) {
+            return self::fromEpoch(0);
+        }
+
+        if (!(is_string($timestamp) || is_numeric($timestamp))) {
+            throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromTimestamp');
+        }
+
+        try {
+            if ($expectedFormat == 'iso8601') {
+                try {
+                    return self::fromISO8601($timestamp);
+                } catch (Exception $exception) {
+                    return self::fromEpoch($timestamp);
+                }
+            } else if ($expectedFormat == 'unixTimestamp') {
+                try {
+                    return self::fromEpoch($timestamp);
+                } catch (Exception $exception) {
+                    return self::fromISO8601($timestamp);
+                }
+            } else if (\Aws\is_valid_epoch($timestamp)) {
+                return self::fromEpoch($timestamp);
+            }
+            return self::fromISO8601($timestamp);
+        } catch (Exception $exception) {
+            throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromTimestamp');
+        }
+    }
+
+    /**
+     * Serialize the DateTimeResult as an ISO 8601 date string.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->format('c');
+    }
+
+    /**
+     * Serialize the date as an ISO 8601 date when serializing as JSON.
+     *
+     * @return string
+     */
+    #[\ReturnTypeWillChange]
+    public function jsonSerialize()
+    {
+        return (string) $this;
+    }
+}

+ 138 - 0
vendor/aws/aws-sdk-php/src/Api/DocModel.php

@@ -0,0 +1,138 @@
+<?php
+namespace Aws\Api;
+
+/**
+ * Encapsulates the documentation strings for a given service-version and
+ * provides methods for extracting the desired parts related to a service,
+ * operation, error, or shape (i.e., parameter).
+ */
+class DocModel
+{
+    /** @var array */
+    private $docs;
+
+    /**
+     * @param array $docs
+     *
+     * @throws \RuntimeException
+     */
+    public function __construct(array $docs)
+    {
+        if (!extension_loaded('tidy')) {
+            throw new \RuntimeException('The "tidy" PHP extension is required.');
+        }
+
+        $this->docs = $docs;
+    }
+
+    /**
+     * Convert the doc model to an array.
+     *
+     * @return array
+     */
+    public function toArray()
+    {
+        return $this->docs;
+    }
+
+    /**
+     * Retrieves documentation about the service.
+     *
+     * @return null|string
+     */
+    public function getServiceDocs()
+    {
+        return isset($this->docs['service']) ? $this->docs['service'] : null;
+    }
+
+    /**
+     * Retrieves documentation about an operation.
+     *
+     * @param string $operation Name of the operation
+     *
+     * @return null|string
+     */
+    public function getOperationDocs($operation)
+    {
+        return isset($this->docs['operations'][$operation])
+            ? $this->docs['operations'][$operation]
+            : null;
+    }
+
+    /**
+     * Retrieves documentation about an error.
+     *
+     * @param string $error Name of the error
+     *
+     * @return null|string
+     */
+    public function getErrorDocs($error)
+    {
+        return isset($this->docs['shapes'][$error]['base'])
+            ? $this->docs['shapes'][$error]['base']
+            : null;
+    }
+
+    /**
+     * Retrieves documentation about a shape, specific to the context.
+     *
+     * @param string $shapeName  Name of the shape.
+     * @param string $parentName Name of the parent/context shape.
+     * @param string $ref        Name used by the context to reference the shape.
+     *
+     * @return null|string
+     */
+    public function getShapeDocs($shapeName, $parentName, $ref)
+    {
+        if (!isset($this->docs['shapes'][$shapeName])) {
+            return '';
+        }
+
+        $result = '';
+        $d = $this->docs['shapes'][$shapeName];
+        if (isset($d['refs']["{$parentName}\$${ref}"])) {
+            $result = $d['refs']["{$parentName}\$${ref}"];
+        } elseif (isset($d['base'])) {
+            $result = $d['base'];
+        }
+
+        if (isset($d['append'])) {
+            if (!isset($d['excludeAppend'])
+                || !in_array($parentName, $d['excludeAppend'])
+            ) {
+                $result .= $d['append'];
+            }
+        }
+
+        if (isset($d['appendOnly'])
+           && in_array($parentName, $d['appendOnly']['shapes'])
+        ) {
+            $result .= $d['appendOnly']['message'];
+        }
+
+        return $this->clean($result);
+    }
+
+    private function clean($content)
+    {
+        if (!$content) {
+            return '';
+        }
+
+        $tidy = new \tidy();
+        $tidy->parseString($content, [
+            'indent' => true,
+            'doctype' => 'omit',
+            'output-html' => true,
+            'show-body-only' => true,
+            'drop-empty-paras' => true,
+            'drop-font-tags' => true,
+            'drop-proprietary-attributes' => true,
+            'hide-comments' => true,
+            'logical-emphasis' => true
+        ]);
+        $tidy->cleanRepair();
+
+        return (string) $content;
+    }
+}

+ 95 - 0
vendor/aws/aws-sdk-php/src/Api/ErrorParser/AbstractErrorParser.php

@@ -0,0 +1,95 @@
+<?php
+namespace Aws\Api\ErrorParser;
+
+use Aws\Api\Parser\MetadataParserTrait;
+use Aws\Api\Parser\PayloadParserTrait;
+use Aws\Api\Service;
+use Aws\Api\StructureShape;
+use Aws\CommandInterface;
+use Psr\Http\Message\ResponseInterface;
+
+abstract class AbstractErrorParser
+{
+    use MetadataParserTrait;
+    use PayloadParserTrait;
+
+    /**
+     * @var Service
+     */
+    protected $api;
+
+    /**
+     * @param Service $api
+     */
+    public function __construct(Service $api = null)
+    {
+        $this->api = $api;
+    }
+
+    abstract protected function payload(
+        ResponseInterface $response,
+        StructureShape $member
+    );
+
+    protected function extractPayload(
+        StructureShape $member,
+        ResponseInterface $response
+    ) {
+        if ($member instanceof StructureShape) {
+            // Structure members parse top-level data into a specific key.
+            return $this->payload($response, $member);
+        } else {
+            // Streaming data is just the stream from the response body.
+            return $response->getBody();
+        }
+    }
+
+    protected function populateShape(
+        array &$data,
+        ResponseInterface $response,
+        CommandInterface $command = null
+    ) {
+        $data['body'] = [];
+
+        if (!empty($command) && !empty($this->api)) {
+
+            // If modeled error code is indicated, check for known error shape
+            if (!empty($data['code'])) {
+
+                $errors = $this->api->getOperation($command->getName())->getErrors();
+                foreach ($errors as $key => $error) {
+
+                    // If error code matches a known error shape, populate the body
+                    if ($data['code'] == $error['name']
+                        && $error instanceof StructureShape
+                    ) {
+                        $modeledError = $error;
+                        $data['body'] = $this->extractPayload(
+                            $modeledError,
+                            $response
+                        );
+                        $data['error_shape'] = $modeledError;
+
+                        foreach ($error->getMembers() as $name => $member) {
+                            switch ($member['location']) {
+                                case 'header':
+                                    $this->extractHeader($name, $member, $response, $data['body']);
+                                    break;
+                                case 'headers':
+                                    $this->extractHeaders($name, $member, $response, $data['body']);
+                                    break;
+                                case 'statusCode':
+                                    $this->extractStatus($name, $response, $data['body']);
+                                    break;
+                            }
+                        }
+
+                        break;
+                    }
+                }
+            }
+        }
+
+        return $data;
+    }
+}

+ 52 - 0
vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonParserTrait.php

@@ -0,0 +1,52 @@
+<?php
+namespace Aws\Api\ErrorParser;
+
+use Aws\Api\Parser\PayloadParserTrait;
+use Aws\Api\StructureShape;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Provides basic JSON error parsing functionality.
+ */
+trait JsonParserTrait
+{
+    use PayloadParserTrait;
+
+    private function genericHandler(ResponseInterface $response)
+    {
+        $code = (string) $response->getStatusCode();
+        if ($this->api
+            && !is_null($this->api->getMetadata('awsQueryCompatible'))
+            && $response->getHeaderLine('x-amzn-query-error')
+        ) {
+            $queryError = $response->getHeaderLine('x-amzn-query-error');
+            $parts = explode(';', $queryError);
+            if (isset($parts) && count($parts) == 2 && $parts[0] && $parts[1]) {
+                $error_code = $parts[0];
+                $error_type = $parts[1];
+            }
+        }
+        if (!isset($error_type)) {
+            $error_type = $code[0] == '4' ? 'client' : 'server';
+        }
+
+        return [
+            'request_id'  => (string) $response->getHeaderLine('x-amzn-requestid'),
+            'code'        => isset($error_code) ? $error_code : null,
+            'message'     => null,
+            'type'        => $error_type,
+            'parsed'      => $this->parseJson($response->getBody(), $response)
+        ];
+    }
+
+    protected function payload(
+        ResponseInterface $response,
+        StructureShape $member
+    ) {
+        $jsonBody = $this->parseJson($response->getBody(), $response);
+
+        if ($jsonBody) {
+            return $this->parser->parse($member, $jsonBody);
+        }
+    }
+}

+ 49 - 0
vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonRpcErrorParser.php

@@ -0,0 +1,49 @@
+<?php
+namespace Aws\Api\ErrorParser;
+
+use Aws\Api\Parser\JsonParser;
+use Aws\Api\Service;
+use Aws\CommandInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Parsers JSON-RPC errors.
+ */
+class JsonRpcErrorParser extends AbstractErrorParser
+{
+    use JsonParserTrait;
+
+    private $parser;
+
+    public function __construct(Service $api = null, JsonParser $parser = null)
+    {
+        parent::__construct($api);
+        $this->parser = $parser ?: new JsonParser();
+    }
+
+    public function __invoke(
+        ResponseInterface $response,
+        CommandInterface $command = null
+    ) {
+        $data = $this->genericHandler($response);
+
+        // Make the casing consistent across services.
+        if ($data['parsed']) {
+            $data['parsed'] = array_change_key_case($data['parsed']);
+        }
+
+        if (isset($data['parsed']['__type'])) {
+            if (!isset($data['code'])) {
+                $parts = explode('#', $data['parsed']['__type']);
+                $data['code'] = isset($parts[1]) ? $parts[1] : $parts[0];
+            }
+            $data['message'] = isset($data['parsed']['message'])
+                ? $data['parsed']['message']
+                : null;
+        }
+
+        $this->populateShape($data, $response, $command);
+
+        return $data;
+    }
+}

+ 58 - 0
vendor/aws/aws-sdk-php/src/Api/ErrorParser/RestJsonErrorParser.php

@@ -0,0 +1,58 @@
+<?php
+namespace Aws\Api\ErrorParser;
+
+use Aws\Api\Parser\JsonParser;
+use Aws\Api\Service;
+use Aws\Api\StructureShape;
+use Aws\CommandInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Parses JSON-REST errors.
+ */
+class RestJsonErrorParser extends AbstractErrorParser
+{
+    use JsonParserTrait;
+
+    private $parser;
+
+    public function __construct(Service $api = null, JsonParser $parser = null)
+    {
+        parent::__construct($api);
+        $this->parser = $parser ?: new JsonParser();
+    }
+
+    public function __invoke(
+        ResponseInterface $response,
+        CommandInterface $command = null
+    ) {
+        $data = $this->genericHandler($response);
+
+        // Merge in error data from the JSON body
+        if ($json = $data['parsed']) {
+            $data = array_replace($data, $json);
+        }
+
+        // Correct error type from services like Amazon Glacier
+        if (!empty($data['type'])) {
+            $data['type'] = strtolower($data['type']);
+        }
+
+        // Retrieve the error code from services like Amazon Elastic Transcoder
+        if ($code = $response->getHeaderLine('x-amzn-errortype')) {
+            $colon = strpos($code, ':');
+            $data['code'] = $colon ? substr($code, 0, $colon) : $code;
+        }
+
+        // Retrieve error message directly
+        $data['message'] = isset($data['parsed']['message'])
+            ? $data['parsed']['message']
+            : (isset($data['parsed']['Message'])
+                ? $data['parsed']['Message']
+                : null);
+
+        $this->populateShape($data, $response, $command);
+
+        return $data;
+    }
+}

+ 111 - 0
vendor/aws/aws-sdk-php/src/Api/ErrorParser/XmlErrorParser.php

@@ -0,0 +1,111 @@
+<?php
+namespace Aws\Api\ErrorParser;
+
+use Aws\Api\Parser\PayloadParserTrait;
+use Aws\Api\Parser\XmlParser;
+use Aws\Api\Service;
+use Aws\Api\StructureShape;
+use Aws\CommandInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Parses XML errors.
+ */
+class XmlErrorParser extends AbstractErrorParser
+{
+    use PayloadParserTrait;
+
+    protected $parser;
+
+    public function __construct(Service $api = null, XmlParser $parser = null)
+    {
+        parent::__construct($api);
+        $this->parser = $parser ?: new XmlParser();
+    }
+
+    public function __invoke(
+        ResponseInterface $response,
+        CommandInterface $command = null
+    ) {
+        $code = (string) $response->getStatusCode();
+
+        $data = [
+            'type' => $code[0] == '4' ? 'client' : 'server',
+            'request_id' => null,
+            'code' => null,
+            'message' => null,
+            'parsed' => null
+        ];
+
+        $body = $response->getBody();
+        if ($body->getSize() > 0) {
+            $this->parseBody($this->parseXml($body, $response), $data);
+        } else {
+            $this->parseHeaders($response, $data);
+        }
+
+        $this->populateShape($data, $response, $command);
+
+        return $data;
+    }
+
+    private function parseHeaders(ResponseInterface $response, array &$data)
+    {
+        if ($response->getStatusCode() == '404') {
+            $data['code'] = 'NotFound';
+        }
+
+        $data['message'] = $response->getStatusCode() . ' '
+            . $response->getReasonPhrase();
+
+        if ($requestId = $response->getHeaderLine('x-amz-request-id')) {
+            $data['request_id'] = $requestId;
+            $data['message'] .= " (Request-ID: $requestId)";
+        }
+    }
+
+    private function parseBody(\SimpleXMLElement $body, array &$data)
+    {
+        $data['parsed'] = $body;
+        $prefix = $this->registerNamespacePrefix($body);
+
+        if ($tempXml = $body->xpath("//{$prefix}Code[1]")) {
+            $data['code'] = (string) $tempXml[0];
+        }
+
+        if ($tempXml = $body->xpath("//{$prefix}Message[1]")) {
+            $data['message'] = (string) $tempXml[0];
+        }
+
+        $tempXml = $body->xpath("//{$prefix}RequestId[1]");
+        if (isset($tempXml[0])) {
+            $data['request_id'] = (string)$tempXml[0];
+        }
+    }
+
+    protected function registerNamespacePrefix(\SimpleXMLElement $element)
+    {
+        $namespaces = $element->getDocNamespaces();
+        if (!isset($namespaces[''])) {
+            return '';
+        } 
+        
+        // Account for the default namespace being defined and PHP not
+        // being able to handle it :(.
+        $element->registerXPathNamespace('ns', $namespaces['']);
+        return 'ns:';
+    }
+
+    protected function payload(
+        ResponseInterface $response,
+        StructureShape $member
+    ) {
+        $xmlBody = $this->parseXml($response->getBody(), $response);
+        $prefix = $this->registerNamespacePrefix($xmlBody);
+        $errorBody = $xmlBody->xpath("//{$prefix}Error");
+
+        if (is_array($errorBody) && !empty($errorBody[0])) {
+            return $this->parser->parse($member, $errorBody[0]);
+        }
+    }
+}

+ 35 - 0
vendor/aws/aws-sdk-php/src/Api/ListShape.php

@@ -0,0 +1,35 @@
+<?php
+namespace Aws\Api;
+
+/**
+ * Represents a list shape.
+ */
+class ListShape extends Shape
+{
+    private $member;
+
+    public function __construct(array $definition, ShapeMap $shapeMap)
+    {
+        $definition['type'] = 'list';
+        parent::__construct($definition, $shapeMap);
+    }
+
+    /**
+     * @return Shape
+     * @throws \RuntimeException if no member is specified
+     */
+    public function getMember()
+    {
+        if (!$this->member) {
+            if (!isset($this->definition['member'])) {
+                throw new \RuntimeException('No member attribute specified');
+            }
+            $this->member = Shape::create(
+                $this->definition['member'],
+                $this->shapeMap
+            );
+        }
+
+        return $this->member;
+    }
+}

+ 54 - 0
vendor/aws/aws-sdk-php/src/Api/MapShape.php

@@ -0,0 +1,54 @@
+<?php
+namespace Aws\Api;
+
+/**
+ * Represents a map shape.
+ */
+class MapShape extends Shape
+{
+    /** @var Shape */
+    private $value;
+
+    /** @var Shape */
+    private $key;
+
+    public function __construct(array $definition, ShapeMap $shapeMap)
+    {
+        $definition['type'] = 'map';
+        parent::__construct($definition, $shapeMap);
+    }
+
+    /**
+     * @return Shape
+     * @throws \RuntimeException if no value is specified
+     */
+    public function getValue()
+    {
+        if (!$this->value) {
+            if (!isset($this->definition['value'])) {
+                throw new \RuntimeException('No value specified');
+            }
+
+            $this->value = Shape::create(
+                $this->definition['value'],
+                $this->shapeMap
+            );
+        }
+
+        return $this->value;
+    }
+
+    /**
+     * @return Shape
+     */
+    public function getKey()
+    {
+        if (!$this->key) {
+            $this->key = isset($this->definition['key'])
+                ? Shape::create($this->definition['key'], $this->shapeMap)
+                : new Shape(['type' => 'string'], $this->shapeMap);
+        }
+
+        return $this->key;
+    }
+}

+ 142 - 0
vendor/aws/aws-sdk-php/src/Api/Operation.php

@@ -0,0 +1,142 @@
+<?php
+namespace Aws\Api;
+
+/**
+ * Represents an API operation.
+ */
+class Operation extends AbstractModel
+{
+    private $input;
+    private $output;
+    private $errors;
+    private $staticContextParams = [];
+    private $contextParams;
+
+    public function __construct(array $definition, ShapeMap $shapeMap)
+    {
+        $definition['type'] = 'structure';
+
+        if (!isset($definition['http']['method'])) {
+            $definition['http']['method'] = 'POST';
+        }
+
+        if (!isset($definition['http']['requestUri'])) {
+            $definition['http']['requestUri'] = '/';
+        }
+
+        if (isset($definition['staticContextParams'])) {
+            $this->staticContextParams = $definition['staticContextParams'];
+        }
+
+        parent::__construct($definition, $shapeMap);
+        $this->contextParams = $this->setContextParams();
+    }
+
+    /**
+     * Returns an associative array of the HTTP attribute of the operation:
+     *
+     * - method: HTTP method of the operation
+     * - requestUri: URI of the request (can include URI template placeholders)
+     *
+     * @return array
+     */
+    public function getHttp()
+    {
+        return $this->definition['http'];
+    }
+
+    /**
+     * Get the input shape of the operation.
+     *
+     * @return StructureShape
+     */
+    public function getInput()
+    {
+        if (!$this->input) {
+            if ($input = $this['input']) {
+                $this->input = $this->shapeFor($input);
+            } else {
+                $this->input = new StructureShape([], $this->shapeMap);
+            }
+        }
+
+        return $this->input;
+    }
+
+    /**
+     * Get the output shape of the operation.
+     *
+     * @return StructureShape
+     */
+    public function getOutput()
+    {
+        if (!$this->output) {
+            if ($output = $this['output']) {
+                $this->output = $this->shapeFor($output);
+            } else {
+                $this->output = new StructureShape([], $this->shapeMap);
+            }
+        }
+
+        return $this->output;
+    }
+
+    /**
+     * Get an array of operation error shapes.
+     *
+     * @return Shape[]
+     */
+    public function getErrors()
+    {
+        if ($this->errors === null) {
+            if ($errors = $this['errors']) {
+                foreach ($errors as $key => $error) {
+                    $errors[$key] = $this->shapeFor($error);
+                }
+                $this->errors = $errors;
+            } else {
+                $this->errors = [];
+            }
+        }
+
+        return $this->errors;
+    }
+
+    /**
+     * Gets static modeled static values used for
+     * endpoint resolution.
+     *
+     * @return array
+     */
+    public function getStaticContextParams()
+    {
+        return $this->staticContextParams;
+    }
+
+    /**
+     * Gets definition of modeled dynamic values used
+     * for endpoint resolution
+     *
+     * @return array
+     */
+    public function getContextParams()
+    {
+        return $this->contextParams;
+    }
+
+    private function setContextParams()
+    {
+        $members = $this->getInput()->getMembers();
+        $contextParams = [];
+
+        foreach($members as $name => $shape) {
+            if (!empty($contextParam = $shape->getContextParam())) {
+                $contextParams[$contextParam['name']] = [
+                    'shape' => $name,
+                    'type' => $shape->getType()
+                ];
+            }
+        }
+        return $contextParams;
+    }
+}

+ 46 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/AbstractParser.php

@@ -0,0 +1,46 @@
+<?php
+namespace Aws\Api\Parser;
+
+use Aws\Api\Service;
+use Aws\Api\StructureShape;
+use Aws\CommandInterface;
+use Aws\ResultInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * @internal
+ */
+abstract class AbstractParser
+{
+    /** @var \Aws\Api\Service Representation of the service API*/
+    protected $api;
+
+    /** @var callable */
+    protected $parser;
+
+    /**
+     * @param Service $api Service description.
+     */
+    public function __construct(Service $api)
+    {
+        $this->api = $api;
+    }
+
+    /**
+     * @param CommandInterface  $command  Command that was executed.
+     * @param ResponseInterface $response Response that was received.
+     *
+     * @return ResultInterface
+     */
+    abstract public function __invoke(
+        CommandInterface $command,
+        ResponseInterface $response
+    );
+
+    abstract public function parseMemberFromStream(
+        StreamInterface $stream,
+        StructureShape $member,
+        $response
+    );
+}

+ 184 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/AbstractRestParser.php

@@ -0,0 +1,184 @@
+<?php
+namespace Aws\Api\Parser;
+
+use Aws\Api\DateTimeResult;
+use Aws\Api\Shape;
+use Aws\Api\StructureShape;
+use Aws\Result;
+use Aws\CommandInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * @internal
+ */
+abstract class AbstractRestParser extends AbstractParser
+{
+    use PayloadParserTrait;
+
+    /**
+     * Parses a payload from a response.
+     *
+     * @param ResponseInterface $response Response to parse.
+     * @param StructureShape    $member   Member to parse
+     * @param array             $result   Result value
+     *
+     * @return mixed
+     */
+    abstract protected function payload(
+        ResponseInterface $response,
+        StructureShape $member,
+        array &$result
+    );
+
+    public function __invoke(
+        CommandInterface $command,
+        ResponseInterface $response
+    ) {
+        $output = $this->api->getOperation($command->getName())->getOutput();
+        $result = [];
+
+        if ($payload = $output['payload']) {
+            $this->extractPayload($payload, $output, $response, $result);
+        }
+
+        foreach ($output->getMembers() as $name => $member) {
+            switch ($member['location']) {
+                case 'header':
+                    $this->extractHeader($name, $member, $response, $result);
+                    break;
+                case 'headers':
+                    $this->extractHeaders($name, $member, $response, $result);
+                    break;
+                case 'statusCode':
+                    $this->extractStatus($name, $response, $result);
+                    break;
+            }
+        }
+
+        if (!$payload
+            && $response->getBody()->getSize() > 0
+            && count($output->getMembers()) > 0
+        ) {
+            // if no payload was found, then parse the contents of the body
+            $this->payload($response, $output, $result);
+        }
+
+        return new Result($result);
+    }
+
+    private function extractPayload(
+        $payload,
+        StructureShape $output,
+        ResponseInterface $response,
+        array &$result
+    ) {
+        $member = $output->getMember($payload);
+
+        if (!empty($member['eventstream'])) {
+            $result[$payload] = new EventParsingIterator(
+                $response->getBody(),
+                $member,
+                $this
+            );
+        } else if ($member instanceof StructureShape) {
+            // Structure members parse top-level data into a specific key.
+            $result[$payload] = [];
+            $this->payload($response, $member, $result[$payload]);
+        } else {
+            // Streaming data is just the stream from the response body.
+            $result[$payload] = $response->getBody();
+        }
+    }
+
+    /**
+     * Extract a single header from the response into the result.
+     */
+    private function extractHeader(
+        $name,
+        Shape $shape,
+        ResponseInterface $response,
+        &$result
+    ) {
+        $value = $response->getHeaderLine($shape['locationName'] ?: $name);
+
+        switch ($shape->getType()) {
+            case 'float':
+            case 'double':
+                $value = (float) $value;
+                break;
+            case 'long':
+                $value = (int) $value;
+                break;
+            case 'boolean':
+                $value = filter_var($value, FILTER_VALIDATE_BOOLEAN);
+                break;
+            case 'blob':
+                $value = base64_decode($value);
+                break;
+            case 'timestamp':
+                try {
+                    $value = DateTimeResult::fromTimestamp(
+                        $value,
+                        !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null
+                    );
+                    break;
+                } catch (\Exception $e) {
+                    // If the value cannot be parsed, then do not add it to the
+                    // output structure.
+                    return;
+                }
+            case 'string':
+                try {
+                    if ($shape['jsonvalue']) {
+                        $value = $this->parseJson(base64_decode($value), $response);
+                    }
+
+                    // If value is not set, do not add to output structure.
+                    if (!isset($value)) {
+                        return;
+                    }
+                    break;
+                } catch (\Exception $e) {
+                    //If the value cannot be parsed, then do not add it to the
+                    //output structure.
+                    return;
+                }
+        }
+
+        $result[$name] = $value;
+    }
+
+    /**
+     * Extract a map of headers with an optional prefix from the response.
+     */
+    private function extractHeaders(
+        $name,
+        Shape $shape,
+        ResponseInterface $response,
+        &$result
+    ) {
+        // Check if the headers are prefixed by a location name
+        $result[$name] = [];
+        $prefix = $shape['locationName'];
+        $prefixLen = $prefix !== null ? strlen($prefix) : 0;
+
+        foreach ($response->getHeaders() as $k => $values) {
+            if (!$prefixLen) {
+                $result[$name][$k] = implode(', ', $values);
+            } elseif (stripos($k, $prefix) === 0) {
+                $result[$name][substr($k, $prefixLen)] = implode(', ', $values);
+            }
+        }
+    }
+
+    /**
+     * Places the status code of the response into the result array.
+     */
+    private function extractStatus(
+        $name,
+        ResponseInterface $response,
+        array &$result
+    ) {
+        $result[$name] = (int) $response->getStatusCode();
+    }
+}

+ 54 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/Crc32ValidatingParser.php

@@ -0,0 +1,54 @@
+<?php
+namespace Aws\Api\Parser;
+
+use Aws\Api\StructureShape;
+use Aws\CommandInterface;
+use Aws\Exception\AwsException;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\StreamInterface;
+use GuzzleHttp\Psr7;
+
+/**
+ * @internal Decorates a parser and validates the x-amz-crc32 header.
+ */
+class Crc32ValidatingParser extends AbstractParser
+{
+    /**
+     * @param callable $parser Parser to wrap.
+     */
+    public function __construct(callable $parser)
+    {
+        $this->parser = $parser;
+    }
+
+    public function __invoke(
+        CommandInterface $command,
+        ResponseInterface $response
+    ) {
+        if ($expected = $response->getHeaderLine('x-amz-crc32')) {
+            $hash = hexdec(Psr7\Utils::hash($response->getBody(), 'crc32b'));
+            if ($expected != $hash) {
+                throw new AwsException(
+                    "crc32 mismatch. Expected {$expected}, found {$hash}.",
+                    $command,
+                    [
+                        'code'             => 'ClientChecksumMismatch',
+                        'connection_error' => true,
+                        'response'         => $response
+                    ]
+                );
+            }
+        }
+
+        $fn = $this->parser;
+        return $fn($command, $response);
+    }
+
+    public function parseMemberFromStream(
+        StreamInterface $stream,
+        StructureShape $member,
+        $response
+    ) {
+        return $this->parser->parseMemberFromStream($stream, $member, $response);
+    }
+}

+ 340 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/DecodingEventStreamIterator.php

@@ -0,0 +1,340 @@
+<?php
+
+namespace Aws\Api\Parser;
+
+use \Iterator;
+use Aws\Api\DateTimeResult;
+use GuzzleHttp\Psr7;
+use Psr\Http\Message\StreamInterface;
+use Aws\Api\Parser\Exception\ParserException;
+
+/**
+ * @internal Implements a decoder for a binary encoded event stream that will
+ * decode, validate, and provide individual events from the stream.
+ */
+class DecodingEventStreamIterator implements Iterator
+{
+    const HEADERS = 'headers';
+    const PAYLOAD = 'payload';
+
+    const LENGTH_TOTAL = 'total_length';
+    const LENGTH_HEADERS = 'headers_length';
+
+    const CRC_PRELUDE = 'prelude_crc';
+
+    const BYTES_PRELUDE = 12;
+    const BYTES_TRAILING = 4;
+
+    private static $preludeFormat = [
+        self::LENGTH_TOTAL => 'decodeUint32',
+        self::LENGTH_HEADERS => 'decodeUint32',
+        self::CRC_PRELUDE => 'decodeUint32',
+    ];
+
+    private static $lengthFormatMap = [
+        1 => 'decodeUint8',
+        2 => 'decodeUint16',
+        4 => 'decodeUint32',
+        8 => 'decodeUint64',
+    ];
+
+    private static $headerTypeMap = [
+        0 => 'decodeBooleanTrue',
+        1 => 'decodeBooleanFalse',
+        2 => 'decodeInt8',
+        3 => 'decodeInt16',
+        4 => 'decodeInt32',
+        5 => 'decodeInt64',
+        6 => 'decodeBytes',
+        7 => 'decodeString',
+        8 => 'decodeTimestamp',
+        9 => 'decodeUuid',
+    ];
+
+    /** @var StreamInterface Stream of eventstream shape to parse. */
+    private $stream;
+
+    /** @var array Currently parsed event. */
+    private $currentEvent;
+
+    /** @var int Current in-order event key. */
+    private $key;
+
+    /** @var resource|\HashContext CRC32 hash context for event validation */
+    private $hashContext;
+
+    /** @var int $currentPosition */
+    private $currentPosition;
+
+    /**
+     * DecodingEventStreamIterator constructor.
+     *
+     * @param StreamInterface $stream
+     */
+    public function __construct(StreamInterface $stream)
+    {
+        $this->stream = $stream;
+        $this->rewind();
+    }
+
+    private function parseHeaders($headerBytes)
+    {
+        $headers = [];
+        $bytesRead = 0;
+
+        while ($bytesRead < $headerBytes) {
+            list($key, $numBytes) = $this->decodeString(1);
+            $bytesRead += $numBytes;
+
+            list($type, $numBytes) = $this->decodeUint8();
+            $bytesRead += $numBytes;
+
+            $f = self::$headerTypeMap[$type];
+            list($value, $numBytes) = $this->{$f}();
+            $bytesRead += $numBytes;
+
+            if (isset($headers[$key])) {
+                throw new ParserException('Duplicate key in event headers.');
+            }
+            $headers[$key] = $value;
+        }
+
+        return [$headers, $bytesRead];
+    }
+
+    private function parsePrelude()
+    {
+        $prelude = [];
+        $bytesRead = 0;
+
+        $calculatedCrc = null;
+        foreach (self::$preludeFormat as $key => $decodeFunction) {
+            if ($key === self::CRC_PRELUDE) {
+                $hashCopy = hash_copy($this->hashContext);
+                $calculatedCrc = hash_final($this->hashContext, true);
+                $this->hashContext = $hashCopy;
+            }
+            list($value, $numBytes) = $this->{$decodeFunction}();
+            $bytesRead += $numBytes;
+
+            $prelude[$key] = $value;
+        }
+
+        if (unpack('N', $calculatedCrc)[1] !== $prelude[self::CRC_PRELUDE]) {
+            throw new ParserException('Prelude checksum mismatch.');
+        }
+
+        return [$prelude, $bytesRead];
+    }
+
+    private function parseEvent()
+    {
+        $event = [];
+
+        if ($this->stream->tell() < $this->stream->getSize()) {
+            $this->hashContext = hash_init('crc32b');
+
+            $bytesLeft = $this->stream->getSize() - $this->stream->tell();
+            list($prelude, $numBytes) = $this->parsePrelude();
+            if ($prelude[self::LENGTH_TOTAL] > $bytesLeft) {
+                throw new ParserException('Message length too long.');
+            }
+            $bytesLeft -= $numBytes;
+
+            if ($prelude[self::LENGTH_HEADERS] > $bytesLeft) {
+                throw new ParserException('Headers length too long.');
+            }
+
+            list(
+                $event[self::HEADERS],
+                $numBytes
+            ) = $this->parseHeaders($prelude[self::LENGTH_HEADERS]);
+
+            $event[self::PAYLOAD] = Psr7\Utils::streamFor(
+                $this->readAndHashBytes(
+                    $prelude[self::LENGTH_TOTAL] - self::BYTES_PRELUDE
+                    - $numBytes - self::BYTES_TRAILING
+                )
+            );
+
+            $calculatedCrc = hash_final($this->hashContext, true);
+            $messageCrc = $this->stream->read(4);
+            if ($calculatedCrc !== $messageCrc) {
+                throw new ParserException('Message checksum mismatch.');
+            }
+        }
+
+        return $event;
+    }
+
+    // Iterator Functionality
+
+    /**
+     * @return array
+     */
+    #[\ReturnTypeWillChange]
+    public function current()
+    {
+        return $this->currentEvent;
+    }
+
+    /**
+     * @return int
+     */
+    #[\ReturnTypeWillChange]
+    public function key()
+    {
+        return $this->key;
+    }
+
+    #[\ReturnTypeWillChange]
+    public function next()
+    {
+        $this->currentPosition = $this->stream->tell();
+        if ($this->valid()) {
+            $this->key++;
+            $this->currentEvent = $this->parseEvent();
+        }
+    }
+
+    #[\ReturnTypeWillChange]
+    public function rewind()
+    {
+        $this->stream->rewind();
+        $this->key = 0;
+        $this->currentPosition = 0;
+        $this->currentEvent = $this->parseEvent();
+    }
+
+    /**
+     * @return bool
+     */
+    #[\ReturnTypeWillChange]
+    public function valid()
+    {
+        return $this->currentPosition < $this->stream->getSize();
+    }
+
+    // Decoding Utilities
+
+    private function readAndHashBytes($num)
+    {
+        $bytes = $this->stream->read($num);
+        hash_update($this->hashContext, $bytes);
+        return $bytes;
+    }
+
+    private function decodeBooleanTrue()
+    {
+        return [true, 0];
+    }
+
+    private function decodeBooleanFalse()
+    {
+        return [false, 0];
+    }
+
+    private function uintToInt($val, $size)
+    {
+        $signedCap = pow(2, $size - 1);
+        if ($val > $signedCap) {
+            $val -= (2 * $signedCap);
+        }
+        return $val;
+    }
+
+    private function decodeInt8()
+    {
+        $val = (int)unpack('C', $this->readAndHashBytes(1))[1];
+        return [$this->uintToInt($val, 8), 1];
+    }
+
+    private function decodeUint8()
+    {
+        return [unpack('C', $this->readAndHashBytes(1))[1], 1];
+    }
+
+    private function decodeInt16()
+    {
+        $val = (int)unpack('n', $this->readAndHashBytes(2))[1];
+        return [$this->uintToInt($val, 16), 2];
+    }
+
+    private function decodeUint16()
+    {
+        return [unpack('n', $this->readAndHashBytes(2))[1], 2];
+    }
+
+    private function decodeInt32()
+    {
+        $val = (int)unpack('N', $this->readAndHashBytes(4))[1];
+        return [$this->uintToInt($val, 32), 4];
+    }
+
+    private function decodeUint32()
+    {
+        return [unpack('N', $this->readAndHashBytes(4))[1], 4];
+    }
+
+    private function decodeInt64()
+    {
+        $val = $this->unpackInt64($this->readAndHashBytes(8))[1];
+        return [$this->uintToInt($val, 64), 8];
+    }
+
+    private function decodeUint64()
+    {
+        return [$this->unpackInt64($this->readAndHashBytes(8))[1], 8];
+    }
+
+    private function unpackInt64($bytes)
+    {
+        if (version_compare(PHP_VERSION, '5.6.3', '<')) {
+            $d = unpack('N2', $bytes);
+            return [1 => $d[1] << 32 | $d[2]];
+        }
+        return unpack('J', $bytes);
+    }
+
+    private function decodeBytes($lengthBytes=2)
+    {
+        if (!isset(self::$lengthFormatMap[$lengthBytes])) {
+            throw new ParserException('Undefined variable length format.');
+        }
+        $f = self::$lengthFormatMap[$lengthBytes];
+        list($len, $bytes) = $this->{$f}();
+        return [$this->readAndHashBytes($len), $len + $bytes];
+    }
+
+    private function decodeString($lengthBytes=2)
+    {
+        if (!isset(self::$lengthFormatMap[$lengthBytes])) {
+            throw new ParserException('Undefined variable length format.');
+        }
+        $f = self::$lengthFormatMap[$lengthBytes];
+        list($len, $bytes) = $this->{$f}();
+        return [$this->readAndHashBytes($len), $len + $bytes];
+    }
+
+    private function decodeTimestamp()
+    {
+        list($val, $bytes) = $this->decodeInt64();
+        return [
+            DateTimeResult::createFromFormat('U.u', $val / 1000),
+            $bytes
+        ];
+    }
+
+    private function decodeUuid()
+    {
+        $val = unpack('H32', $this->readAndHashBytes(16))[1];
+        return [
+            substr($val, 0, 8) . '-'
+            . substr($val, 8, 4) . '-'
+            . substr($val, 12, 4) . '-'
+            . substr($val, 16, 4) . '-'
+            . substr($val, 20, 12),
+            16
+        ];
+    }
+}

+ 156 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/EventParsingIterator.php

@@ -0,0 +1,156 @@
+<?php
+
+namespace Aws\Api\Parser;
+
+use \Iterator;
+use Aws\Exception\EventStreamDataException;
+use Aws\Api\Parser\Exception\ParserException;
+use Aws\Api\StructureShape;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * @internal Implements a decoder for a binary encoded event stream that will
+ * decode, validate, and provide individual events from the stream.
+ */
+class EventParsingIterator implements Iterator
+{
+    /** @var StreamInterface */
+    private $decodingIterator;
+
+    /** @var StructureShape */
+    private $shape;
+
+    /** @var AbstractParser */
+    private $parser;
+
+    public function __construct(
+        StreamInterface $stream,
+        StructureShape $shape,
+        AbstractParser $parser
+    ) {
+        $this->decodingIterator = new DecodingEventStreamIterator($stream);
+        $this->shape = $shape;
+        $this->parser = $parser;
+    }
+
+    #[\ReturnTypeWillChange]
+    public function current()
+    {
+        return $this->parseEvent($this->decodingIterator->current());
+    }
+
+    #[\ReturnTypeWillChange]
+    public function key()
+    {
+        return $this->decodingIterator->key();
+    }
+
+    #[\ReturnTypeWillChange]
+    public function next()
+    {
+        $this->decodingIterator->next();
+    }
+
+    #[\ReturnTypeWillChange]
+    public function rewind()
+    {
+        $this->decodingIterator->rewind();
+    }
+
+    #[\ReturnTypeWillChange]
+    public function valid()
+    {
+        return $this->decodingIterator->valid();
+    }
+
+    private function parseEvent(array $event)
+    {
+        if (!empty($event['headers'][':message-type'])) {
+            if ($event['headers'][':message-type'] === 'error') {
+                return $this->parseError($event);
+            }
+
+            if ($event['headers'][':message-type'] !== 'event') {
+                throw new ParserException('Failed to parse unknown message type.');
+            }
+        }
+
+        $eventType = $event['headers'][':event-type'] ?? null;
+        if (empty($eventType)) {
+            throw new ParserException('Failed to parse without event type.');
+        }
+
+        $eventShape = $this->shape->getMember($eventType);
+        $eventPayload = $event['payload'];
+
+        return [
+            $eventType => array_merge(
+                $this->parseEventHeaders($event['headers'], $eventShape),
+                $this->parseEventPayload($eventPayload, $eventShape)
+            )
+        ];
+    }
+
+    /**
+     * @param $headers
+     * @param $eventShape
+     *
+     * @return array
+     */
+    private function parseEventHeaders($headers, $eventShape): array
+    {
+        $parsedHeaders = [];
+        foreach ($eventShape->getMembers() as $memberName => $memberProps) {
+            if (isset($memberProps['eventheader'])) {
+                $parsedHeaders[$memberName] = $headers[$memberName];
+            }
+        }
+
+        return $parsedHeaders;
+    }
+
+    /**
+     * @param $payload
+     * @param $eventShape
+     *
+     * @return array
+     */
+    private function parseEventPayload($payload, $eventShape): array
+    {
+        $parsedPayload = [];
+        foreach ($eventShape->getMembers() as $memberName => $memberProps) {
+            $memberShape = $eventShape->getMember($memberName);
+            if (isset($memberProps['eventpayload'])) {
+                if ($memberShape->getType() === 'blob') {
+                    $parsedPayload[$memberName] = $payload;
+                } else {
+                    $parsedPayload[$memberName] = $this->parser->parseMemberFromStream(
+                        $payload,
+                        $memberShape,
+                        null
+                    );
+                }
+
+                break;
+            }
+        }
+
+        if (empty($parsedPayload) && !empty($payload->getContents())) {
+            /**
+             * If we did not find a member with an eventpayload trait, then we should deserialize the payload
+             * using the event's shape.
+             */
+            $parsedPayload = $this->parser->parseMemberFromStream($payload, $eventShape, null);
+        }
+
+        return $parsedPayload;
+    }
+
+    private function parseError(array $event)
+    {
+        throw new EventStreamDataException(
+            $event['headers'][':error-code'],
+            $event['headers'][':error-message']
+        );
+    }
+}

+ 56 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/Exception/ParserException.php

@@ -0,0 +1,56 @@
+<?php
+namespace Aws\Api\Parser\Exception;
+
+use Aws\HasMonitoringEventsTrait;
+use Aws\MonitoringEventsInterface;
+use Aws\ResponseContainerInterface;
+use Psr\Http\Message\ResponseInterface;
+
+class ParserException extends \RuntimeException implements
+    MonitoringEventsInterface,
+    ResponseContainerInterface
+{
+    use HasMonitoringEventsTrait;
+
+    private $errorCode;
+    private $requestId;
+    private $response;
+
+    public function __construct($message = '', $code = 0, $previous = null, array $context = [])
+    {
+        $this->errorCode = isset($context['error_code']) ? $context['error_code'] : null;
+        $this->requestId = isset($context['request_id']) ? $context['request_id'] : null;
+        $this->response = isset($context['response']) ? $context['response'] : null;
+        parent::__construct($message, $code, $previous);
+    }
+
+    /**
+     * Get the error code, if any.
+     *
+     * @return string|null
+     */
+    public function getErrorCode()
+    {
+        return $this->errorCode;
+    }
+
+    /**
+     * Get the request ID, if any.
+     *
+     * @return string|null
+     */
+    public function getRequestId()
+    {
+        return $this->requestId;
+    }
+
+    /**
+     * Get the received HTTP response if any.
+     *
+     * @return ResponseInterface|null
+     */
+    public function getResponse()
+    {
+        return $this->response;
+    }
+}

+ 71 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/JsonParser.php

@@ -0,0 +1,71 @@
+<?php
+namespace Aws\Api\Parser;
+
+use Aws\Api\DateTimeResult;
+use Aws\Api\Shape;
+
+/**
+ * @internal Implements standard JSON parsing.
+ */
+class JsonParser
+{
+    public function parse(Shape $shape, $value)
+    {
+        if ($value === null) {
+            return $value;
+        }
+
+        switch ($shape['type']) {
+            case 'structure':
+                if (isset($shape['document']) && $shape['document']) {
+                    return $value;
+                }
+                $target = [];
+                foreach ($shape->getMembers() as $name => $member) {
+                    $locationName = $member['locationName'] ?: $name;
+                    if (isset($value[$locationName])) {
+                        $target[$name] = $this->parse($member, $value[$locationName]);
+                    }
+                }
+                if (isset($shape['union'])
+                    && $shape['union']
+                    && is_array($value)
+                    && empty($target)
+                ) {
+                    foreach ($value as $key => $val) {
+                        $target['Unknown'][$key] = $val;
+                    }
+                }
+                return $target;
+
+            case 'list':
+                $member = $shape->getMember();
+                $target = [];
+                foreach ($value as $v) {
+                    $target[] = $this->parse($member, $v);
+                }
+                return $target;
+
+            case 'map':
+                $values = $shape->getValue();
+                $target = [];
+                foreach ($value as $k => $v) {
+                    $target[$k] = $this->parse($values, $v);
+                }
+                return $target;
+
+            case 'timestamp':
+                return DateTimeResult::fromTimestamp(
+                    $value,
+                    !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null
+                );
+
+            case 'blob':
+                return base64_decode($value);
+
+            default:
+                return $value;
+        }
+    }
+}
+

+ 51 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/JsonRpcParser.php

@@ -0,0 +1,51 @@
+<?php
+namespace Aws\Api\Parser;
+
+use Aws\Api\StructureShape;
+use Aws\Api\Service;
+use Aws\Result;
+use Aws\CommandInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * @internal Implements JSON-RPC parsing (e.g., DynamoDB)
+ */
+class JsonRpcParser extends AbstractParser
+{
+    use PayloadParserTrait;
+
+    /**
+     * @param Service    $api    Service description
+     * @param JsonParser $parser JSON body builder
+     */
+    public function __construct(Service $api, JsonParser $parser = null)
+    {
+        parent::__construct($api);
+        $this->parser = $parser ?: new JsonParser();
+    }
+
+    public function __invoke(
+        CommandInterface $command,
+        ResponseInterface $response
+    ) {
+        $operation = $this->api->getOperation($command->getName());
+        $result = null === $operation['output']
+            ? null
+            : $this->parseMemberFromStream(
+                $response->getBody(),
+                $operation->getOutput(),
+                $response
+            );
+
+        return new Result($result ?: []);
+    }
+
+    public function parseMemberFromStream(
+        StreamInterface $stream,
+        StructureShape $member,
+        $response
+    ) {
+        return $this->parser->parse($member, $this->parseJson($stream, $response));
+    }
+}

+ 90 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/MetadataParserTrait.php

@@ -0,0 +1,90 @@
+<?php
+namespace Aws\Api\Parser;
+
+use Aws\Api\DateTimeResult;
+use Aws\Api\Shape;
+use Psr\Http\Message\ResponseInterface;
+
+trait MetadataParserTrait
+{
+    /**
+     * Extract a single header from the response into the result.
+     */
+    protected function extractHeader(
+        $name,
+        Shape $shape,
+        ResponseInterface $response,
+        &$result
+    ) {
+        $value = $response->getHeaderLine($shape['locationName'] ?: $name);
+
+        switch ($shape->getType()) {
+            case 'float':
+            case 'double':
+                $value = (float) $value;
+                break;
+            case 'long':
+                $value = (int) $value;
+                break;
+            case 'boolean':
+                $value = filter_var($value, FILTER_VALIDATE_BOOLEAN);
+                break;
+            case 'blob':
+                $value = base64_decode($value);
+                break;
+            case 'timestamp':
+                try {
+                    $value = DateTimeResult::fromTimestamp(
+                        $value,
+                        !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null
+                    );
+                    break;
+                } catch (\Exception $e) {
+                    // If the value cannot be parsed, then do not add it to the
+                    // output structure.
+                    return;
+                }
+            case 'string':
+                if ($shape['jsonvalue']) {
+                    $value = $this->parseJson(base64_decode($value), $response);
+                }
+                break;
+        }
+
+        $result[$name] = $value;
+    }
+
+    /**
+     * Extract a map of headers with an optional prefix from the response.
+     */
+    protected function extractHeaders(
+        $name,
+        Shape $shape,
+        ResponseInterface $response,
+        &$result
+    ) {
+        // Check if the headers are prefixed by a location name
+        $result[$name] = [];
+        $prefix = $shape['locationName'];
+        $prefixLen = strlen($prefix);
+
+        foreach ($response->getHeaders() as $k => $values) {
+            if (!$prefixLen) {
+                $result[$name][$k] = implode(', ', $values);
+            } elseif (stripos($k, $prefix) === 0) {
+                $result[$name][substr($k, $prefixLen)] = implode(', ', $values);
+            }
+        }
+    }
+
+    /**
+     * Places the status code of the response into the result array.
+     */
+    protected function extractStatus(
+        $name,
+        ResponseInterface $response,
+        array &$result
+    ) {
+        $result[$name] = (int) $response->getStatusCode();
+    }
+}

+ 61 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/PayloadParserTrait.php

@@ -0,0 +1,61 @@
+<?php
+namespace Aws\Api\Parser;
+
+use Aws\Api\Parser\Exception\ParserException;
+use Psr\Http\Message\ResponseInterface;
+
+trait PayloadParserTrait
+{
+    /**
+     * @param string $json
+     *
+     * @throws ParserException
+     *
+     * @return array
+     */
+    private function parseJson($json, $response)
+    {
+        $jsonPayload = json_decode($json, true);
+
+        if (JSON_ERROR_NONE !== json_last_error()) {
+            throw new ParserException(
+                'Error parsing JSON: ' . json_last_error_msg(),
+                0,
+                null,
+                ['response' => $response]
+            );
+        }
+
+        return $jsonPayload;
+    }
+
+    /**
+     * @param string $xml
+     *
+     * @throws ParserException
+     *
+     * @return \SimpleXMLElement
+     */
+    protected function parseXml($xml, $response)
+    {
+        $priorSetting = libxml_use_internal_errors(true);
+        try {
+            libxml_clear_errors();
+            $xmlPayload = new \SimpleXMLElement($xml);
+            if ($error = libxml_get_last_error()) {
+                throw new \RuntimeException($error->message);
+            }
+        } catch (\Exception $e) {
+            throw new ParserException(
+                "Error parsing XML: {$e->getMessage()}",
+                0,
+                $e,
+                ['response' => $response]
+            );
+        } finally {
+            libxml_use_internal_errors($priorSetting);
+        }
+
+        return $xmlPayload;
+    }
+}

+ 60 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/QueryParser.php

@@ -0,0 +1,60 @@
+<?php
+namespace Aws\Api\Parser;
+
+use Aws\Api\Service;
+use Aws\Api\StructureShape;
+use Aws\Result;
+use Aws\CommandInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * @internal Parses query (XML) responses (e.g., EC2, SQS, and many others)
+ */
+class QueryParser extends AbstractParser
+{
+    use PayloadParserTrait;
+
+    /** @var bool */
+    private $honorResultWrapper;
+
+    /**
+     * @param Service   $api                Service description
+     * @param XmlParser $xmlParser          Optional XML parser
+     * @param bool      $honorResultWrapper Set to false to disable the peeling
+     *                                      back of result wrappers from the
+     *                                      output structure.
+     */
+    public function __construct(
+        Service $api,
+        XmlParser $xmlParser = null,
+        $honorResultWrapper = true
+    ) {
+        parent::__construct($api);
+        $this->parser = $xmlParser ?: new XmlParser();
+        $this->honorResultWrapper = $honorResultWrapper;
+    }
+
+    public function __invoke(
+        CommandInterface $command,
+        ResponseInterface $response
+    ) {
+        $output = $this->api->getOperation($command->getName())->getOutput();
+        $xml = $this->parseXml($response->getBody(), $response);
+
+        if ($this->honorResultWrapper && $output['resultWrapper']) {
+            $xml = $xml->{$output['resultWrapper']};
+        }
+
+        return new Result($this->parser->parse($output, $xml));
+    }
+
+    public function parseMemberFromStream(
+        StreamInterface $stream,
+        StructureShape $member,
+        $response
+    ) {
+        $xml = $this->parseXml($stream, $response);
+        return $this->parser->parse($member, $xml);
+    }
+}

+ 49 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/RestJsonParser.php

@@ -0,0 +1,49 @@
+<?php
+namespace Aws\Api\Parser;
+
+use Aws\Api\Service;
+use Aws\Api\StructureShape;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * @internal Implements REST-JSON parsing (e.g., Glacier, Elastic Transcoder)
+ */
+class RestJsonParser extends AbstractRestParser
+{
+    use PayloadParserTrait;
+
+    /**
+     * @param Service    $api    Service description
+     * @param JsonParser $parser JSON body builder
+     */
+    public function __construct(Service $api, JsonParser $parser = null)
+    {
+        parent::__construct($api);
+        $this->parser = $parser ?: new JsonParser();
+    }
+
+    protected function payload(
+        ResponseInterface $response,
+        StructureShape $member,
+        array &$result
+    ) {
+        $jsonBody = $this->parseJson($response->getBody(), $response);
+
+        if ($jsonBody) {
+            $result += $this->parser->parse($member, $jsonBody);
+        }
+    }
+
+    public function parseMemberFromStream(
+        StreamInterface $stream,
+        StructureShape $member,
+        $response
+    ) {
+        $jsonBody = $this->parseJson($stream, $response);
+        if ($jsonBody) {
+            return $this->parser->parse($member, $jsonBody);
+        }
+        return [];
+    }
+}

+ 42 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/RestXmlParser.php

@@ -0,0 +1,42 @@
+<?php
+namespace Aws\Api\Parser;
+
+use Aws\Api\StructureShape;
+use Aws\Api\Service;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * @internal Implements REST-XML parsing (e.g., S3, CloudFront, etc...)
+ */
+class RestXmlParser extends AbstractRestParser
+{
+    use PayloadParserTrait;
+
+    /**
+     * @param Service   $api    Service description
+     * @param XmlParser $parser XML body parser
+     */
+    public function __construct(Service $api, XmlParser $parser = null)
+    {
+        parent::__construct($api);
+        $this->parser = $parser ?: new XmlParser();
+    }
+
+    protected function payload(
+        ResponseInterface $response,
+        StructureShape $member,
+        array &$result
+    ) {
+        $result += $this->parseMemberFromStream($response->getBody(), $member, $response);
+    }
+
+    public function parseMemberFromStream(
+        StreamInterface $stream,
+        StructureShape $member,
+        $response
+    ) {
+        $xml = $this->parseXml($stream, $response);
+        return $this->parser->parse($member, $xml);
+    }
+}

+ 179 - 0
vendor/aws/aws-sdk-php/src/Api/Parser/XmlParser.php

@@ -0,0 +1,179 @@
+<?php
+namespace Aws\Api\Parser;
+
+use Aws\Api\DateTimeResult;
+use Aws\Api\ListShape;
+use Aws\Api\MapShape;
+use Aws\Api\Parser\Exception\ParserException;
+use Aws\Api\Shape;
+use Aws\Api\StructureShape;
+
+/**
+ * @internal Implements standard XML parsing for REST-XML and Query protocols.
+ */
+class XmlParser
+{
+    public function parse(StructureShape $shape, \SimpleXMLElement $value)
+    {
+        return $this->dispatch($shape, $value);
+    }
+
+    private function dispatch($shape, \SimpleXMLElement $value)
+    {
+        static $methods = [
+            'structure' => 'parse_structure',
+            'list'      => 'parse_list',
+            'map'       => 'parse_map',
+            'blob'      => 'parse_blob',
+            'boolean'   => 'parse_boolean',
+            'integer'   => 'parse_integer',
+            'float'     => 'parse_float',
+            'double'    => 'parse_float',
+            'timestamp' => 'parse_timestamp',
+        ];
+
+        $type = $shape['type'];
+        if (isset($methods[$type])) {
+            return $this->{$methods[$type]}($shape, $value);
+        }
+
+        return (string) $value;
+    }
+
+    private function parse_structure(
+        StructureShape $shape,
+        \SimpleXMLElement $value
+    ) {
+        $target = [];
+
+        foreach ($shape->getMembers() as $name => $member) {
+            // Extract the name of the XML node
+            $node = $this->memberKey($member, $name);
+            if (isset($value->{$node})) {
+                $target[$name] = $this->dispatch($member, $value->{$node});
+            } else {
+                $memberShape = $shape->getMember($name);
+                if (!empty($memberShape['xmlAttribute'])) {
+                    $target[$name] = $this->parse_xml_attribute(
+                        $shape,
+                        $memberShape,
+                        $value
+                    );
+                }
+            }
+        }
+        if (isset($shape['union'])
+            && $shape['union']
+            && empty($target)
+        ) {
+            foreach ($value as $key => $val) {
+                $name = $val->children()->getName();
+                $target['Unknown'][$name] = $val->$name;
+            }
+        }
+        return $target;
+    }
+
+    private function memberKey(Shape $shape, $name)
+    {
+        if (null !== $shape['locationName']) {
+            return $shape['locationName'];
+        }
+
+        if ($shape instanceof ListShape && $shape['flattened']) {
+            return $shape->getMember()['locationName'] ?: $name;
+        }
+
+        return $name;
+    }
+
+    private function parse_list(ListShape $shape, \SimpleXMLElement  $value)
+    {
+        $target = [];
+        $member = $shape->getMember();
+
+        if (!$shape['flattened']) {
+            $value = $value->{$member['locationName'] ?: 'member'};
+        }
+
+        foreach ($value as $v) {
+            $target[] = $this->dispatch($member, $v);
+        }
+
+        return $target;
+    }
+
+    private function parse_map(MapShape $shape, \SimpleXMLElement $value)
+    {
+        $target = [];
+
+        if (!$shape['flattened']) {
+            $value = $value->entry;
+        }
+
+        $mapKey = $shape->getKey();
+        $mapValue = $shape->getValue();
+        $keyName = $shape->getKey()['locationName'] ?: 'key';
+        $valueName = $shape->getValue()['locationName'] ?: 'value';
+
+        foreach ($value as $node) {
+            $key = $this->dispatch($mapKey, $node->{$keyName});
+            $value = $this->dispatch($mapValue, $node->{$valueName});
+            $target[$key] = $value;
+        }
+
+        return $target;
+    }
+
+    private function parse_blob(Shape $shape, $value)
+    {
+        return base64_decode((string) $value);
+    }
+
+    private function parse_float(Shape $shape, $value)
+    {
+        return (float) (string) $value;
+    }
+
+    private function parse_integer(Shape $shape, $value)
+    {
+        return (int) (string) $value;
+    }
+
+    private function parse_boolean(Shape $shape, $value)
+    {
+        return $value == 'true';
+    }
+
+    private function parse_timestamp(Shape $shape, $value)
+    {
+        if (is_string($value)
+            || is_int($value)
+            || (is_object($value)
+                && method_exists($value, '__toString'))
+        ) {
+            return DateTimeResult::fromTimestamp(
+                (string) $value,
+                !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null
+            );
+        }
+        throw new ParserException('Invalid timestamp value passed to XmlParser::parse_timestamp');
+    }
+
+    private function parse_xml_attribute(Shape $shape, Shape $memberShape, $value)
+    {
+        $namespace = $shape['xmlNamespace']['uri']
+            ? $shape['xmlNamespace']['uri']
+            : '';
+        $prefix = $shape['xmlNamespace']['prefix']
+            ? $shape['xmlNamespace']['prefix']
+            : '';
+        if (!empty($prefix)) {
+            $prefix .= ':';
+        }
+        $key = str_replace($prefix, '', $memberShape['locationName']);
+
+        $attributes = $value->attributes($namespace);
+        return isset($attributes[$key]) ? (string) $attributes[$key] : null;
+    }
+}

+ 40 - 0
vendor/aws/aws-sdk-php/src/Api/Serializer/Ec2ParamBuilder.php

@@ -0,0 +1,40 @@
+<?php
+namespace Aws\Api\Serializer;
+
+use Aws\Api\Shape;
+use Aws\Api\ListShape;
+
+/**
+ * @internal
+ */
+class Ec2ParamBuilder extends QueryParamBuilder
+{
+    protected function queryName(Shape $shape, $default = null)
+    {
+        return ($shape['queryName']
+            ?: ucfirst(@$shape['locationName'] ?: ""))
+                ?: $default;
+    }
+
+    protected function isFlat(Shape $shape)
+    {
+        return false;
+    }
+
+    protected function format_list(
+        ListShape $shape,
+        array $value,
+        $prefix,
+        &$query
+    ) {
+        // Handle empty list serialization
+        if (!$value) {
+            $query[$prefix] = false;
+        } else {
+            $items = $shape->getMember();
+            foreach ($value as $k => $v) {
+                $this->format($items, $v, $prefix . '.' . ($k + 1), $query);
+            }
+        }
+    }
+}

+ 108 - 0
vendor/aws/aws-sdk-php/src/Api/Serializer/JsonBody.php

@@ -0,0 +1,108 @@
+<?php
+namespace Aws\Api\Serializer;
+
+use Aws\Api\Service;
+use Aws\Api\Shape;
+use Aws\Api\TimestampShape;
+use Aws\Exception\InvalidJsonException;
+
+/**
+ * Formats the JSON body of a JSON-REST or JSON-RPC operation.
+ * @internal
+ */
+class JsonBody
+{
+    private $api;
+
+    public function __construct(Service $api)
+    {
+        $this->api = $api;
+    }
+
+    /**
+     * Gets the JSON Content-Type header for a service API
+     *
+     * @param Service $service
+     *
+     * @return string
+     */
+    public static function getContentType(Service $service)
+    {
+        if ($service->getMetadata('protocol') === 'rest-json') {
+            return 'application/json';
+        }
+
+        $jsonVersion = $service->getMetadata('jsonVersion');
+        if (empty($jsonVersion)) {
+            throw new \InvalidArgumentException('invalid json');
+        } else {
+            return 'application/x-amz-json-'
+                . @number_format($service->getMetadata('jsonVersion'), 1);
+        }
+    }
+
+    /**
+     * Builds the JSON body based on an array of arguments.
+     *
+     * @param Shape $shape Operation being constructed
+     * @param array $args  Associative array of arguments
+     *
+     * @return string
+     */
+    public function build(Shape $shape, array $args)
+    {
+        $result = json_encode($this->format($shape, $args));
+        return $result == '[]' ? '{}' : $result;
+    }
+
+    private function format(Shape $shape, $value)
+    {
+        switch ($shape['type']) {
+            case 'structure':
+                $data = [];
+                if (isset($shape['document']) && $shape['document']) {
+                    return $value;
+                }
+                foreach ($value as $k => $v) {
+                    if ($v !== null && $shape->hasMember($k)) {
+                        $valueShape = $shape->getMember($k);
+                        $data[$valueShape['locationName'] ?: $k]
+                            = $this->format($valueShape, $v);
+                    }
+                }
+                if (empty($data)) {
+                    return new \stdClass;
+                }
+                return $data;
+
+            case 'list':
+                $items = $shape->getMember();
+                foreach ($value as $k => $v) {
+                    $value[$k] = $this->format($items, $v);
+                }
+                return $value;
+
+            case 'map':
+                if (empty($value)) {
+                    return new \stdClass;
+                }
+                $values = $shape->getValue();
+                foreach ($value as $k => $v) {
+                    $value[$k] = $this->format($values, $v);
+                }
+                return $value;
+
+            case 'blob':
+                return base64_encode($value);
+
+            case 'timestamp':
+                $timestampFormat = !empty($shape['timestampFormat'])
+                    ? $shape['timestampFormat']
+                    : 'unixTimestamp';
+                return TimestampShape::format($value, $timestampFormat);
+
+            default:
+                return $value;
+        }
+    }
+}

+ 84 - 0
vendor/aws/aws-sdk-php/src/Api/Serializer/JsonRpcSerializer.php

@@ -0,0 +1,84 @@
+<?php
+namespace Aws\Api\Serializer;
+
+use Aws\Api\Service;
+use Aws\CommandInterface;
+use Aws\EndpointV2\EndpointV2SerializerTrait;
+use Aws\EndpointV2\Ruleset\RulesetEndpoint;
+use GuzzleHttp\Psr7\Request;
+use Psr\Http\Message\RequestInterface;
+
+/**
+ * Prepares a JSON-RPC request for transfer.
+ * @internal
+ */
+class JsonRpcSerializer
+{
+    use EndpointV2SerializerTrait;
+
+    /** @var JsonBody */
+    private $jsonFormatter;
+
+    /** @var string */
+    private $endpoint;
+
+    /** @var Service */
+    private $api;
+
+    /** @var string */
+    private $contentType;
+
+    /**
+     * @param Service  $api           Service description
+     * @param string   $endpoint      Endpoint to connect to
+     * @param JsonBody $jsonFormatter Optional JSON formatter to use
+     */
+    public function __construct(
+        Service $api,
+        $endpoint,
+        JsonBody $jsonFormatter = null
+    ) {
+        $this->endpoint = $endpoint;
+        $this->api = $api;
+        $this->jsonFormatter = $jsonFormatter ?: new JsonBody($this->api);
+        $this->contentType = JsonBody::getContentType($api);
+    }
+
+    /**
+     * When invoked with an AWS command, returns a serialization array
+     * containing "method", "uri", "headers", and "body" key value pairs.
+     *
+     * @param CommandInterface $command Command to serialize into a request.
+     * @param $endpointProvider Provider used for dynamic endpoint resolution.
+     * @param $clientArgs Client arguments used for dynamic endpoint resolution.
+     *
+     * @return RequestInterface
+     */
+    public function __invoke(
+        CommandInterface $command,
+        $endpoint = null
+    )
+    {
+        $operationName = $command->getName();
+        $operation = $this->api->getOperation($operationName);
+        $commandArgs = $command->toArray();
+        $headers = [
+                'X-Amz-Target' => $this->api->getMetadata('targetPrefix') . '.' . $operationName,
+                'Content-Type' => $this->contentType
+            ];
+
+        if ($endpoint instanceof RulesetEndpoint) {
+            $this->setEndpointV2RequestOptions($endpoint, $headers);
+        }
+
+        return new Request(
+            $operation['http']['method'],
+            $this->endpoint,
+            $headers,
+            $this->jsonFormatter->build(
+                $operation->getInput(),
+                $commandArgs
+            )
+        );
+    }
+}

+ 157 - 0
vendor/aws/aws-sdk-php/src/Api/Serializer/QueryParamBuilder.php

@@ -0,0 +1,157 @@
+<?php
+namespace Aws\Api\Serializer;
+
+use Aws\Api\StructureShape;
+use Aws\Api\ListShape;
+use Aws\Api\MapShape;
+use Aws\Api\Shape;
+use Aws\Api\TimestampShape;
+
+/**
+ * @internal
+ */
+class QueryParamBuilder
+{
+    private $methods;
+
+    protected function queryName(Shape $shape, $default = null)
+    {
+        if (null !== $shape['queryName']) {
+            return $shape['queryName'];
+        }
+
+        if (null !== $shape['locationName']) {
+            return $shape['locationName'];
+        }
+
+        if ($this->isFlat($shape) && !empty($shape['member']['locationName'])) {
+            return $shape['member']['locationName'];
+        }
+
+        return $default;
+    }
+
+    protected function isFlat(Shape $shape)
+    {
+        return $shape['flattened'] === true;
+    }
+
+    public function __invoke(StructureShape $shape, array $params)
+    {
+        if (!$this->methods) {
+            $this->methods = array_fill_keys(get_class_methods($this), true);
+        }
+
+        $query = [];
+        $this->format_structure($shape, $params, '', $query);
+
+        return $query;
+    }
+
+    protected function format(Shape $shape, $value, $prefix, array &$query)
+    {
+        $type = 'format_' . $shape['type'];
+        if (isset($this->methods[$type])) {
+            $this->{$type}($shape, $value, $prefix, $query);
+        } else {
+            $query[$prefix] = (string) $value;
+        }
+    }
+
+    protected function format_structure(
+        StructureShape $shape,
+        array $value,
+        $prefix,
+        &$query
+    ) {
+        if ($prefix) {
+            $prefix .= '.';
+        }
+
+        foreach ($value as $k => $v) {
+            if ($shape->hasMember($k)) {
+                $member = $shape->getMember($k);
+                $this->format(
+                    $member,
+                    $v,
+                    $prefix . $this->queryName($member, $k),
+                    $query
+                );
+            }
+        }
+    }
+
+    protected function format_list(
+        ListShape $shape,
+        array $value,
+        $prefix,
+        &$query
+    ) {
+        // Handle empty list serialization
+        if (!$value) {
+            $query[$prefix] = '';
+            return;
+        }
+
+        $items = $shape->getMember();
+
+        if (!$this->isFlat($shape)) {
+            $locationName = $shape->getMember()['locationName'] ?: 'member';
+            $prefix .= ".$locationName";
+        } elseif ($name = $this->queryName($items)) {
+            $parts = explode('.', $prefix);
+            $parts[count($parts) - 1] = $name;
+            $prefix = implode('.', $parts);
+        }
+
+        foreach ($value as $k => $v) {
+            $this->format($items, $v, $prefix . '.' . ($k + 1), $query);
+        }
+    }
+
+    protected function format_map(
+        MapShape $shape,
+        array $value,
+        $prefix,
+        array &$query
+    ) {
+        $vals = $shape->getValue();
+        $keys = $shape->getKey();
+
+        if (!$this->isFlat($shape)) {
+            $prefix .= '.entry';
+        }
+
+        $i = 0;
+        $keyName = '%s.%d.' . $this->queryName($keys, 'key');
+        $valueName = '%s.%s.' . $this->queryName($vals, 'value');
+
+        foreach ($value as $k => $v) {
+            $i++;
+            $this->format($keys, $k, sprintf($keyName, $prefix, $i), $query);
+            $this->format($vals, $v, sprintf($valueName, $prefix, $i), $query);
+        }
+    }
+
+    protected function format_blob(Shape $shape, $value, $prefix, array &$query)
+    {
+        $query[$prefix] = base64_encode($value);
+    }
+
+    protected function format_timestamp(
+        TimestampShape $shape,
+        $value,
+        $prefix,
+        array &$query
+    ) {
+        $timestampFormat = !empty($shape['timestampFormat'])
+            ? $shape['timestampFormat']
+            : 'iso8601';
+        $query[$prefix] = TimestampShape::format($value, $timestampFormat);
+    }
+
+    protected function format_boolean(Shape $shape, $value, $prefix, array &$query)
+    {
+        $query[$prefix] = ($value) ? 'true' : 'false';
+    }
+}

+ 81 - 0
vendor/aws/aws-sdk-php/src/Api/Serializer/QuerySerializer.php

@@ -0,0 +1,81 @@
+<?php
+namespace Aws\Api\Serializer;
+
+use Aws\Api\Service;
+use Aws\CommandInterface;
+use Aws\EndpointV2\EndpointProviderV2;
+use Aws\EndpointV2\EndpointV2SerializerTrait;
+use Aws\EndpointV2\Ruleset\RulesetEndpoint;
+use GuzzleHttp\Psr7\Request;
+use Psr\Http\Message\RequestInterface;
+
+/**
+ * Serializes a query protocol request.
+ * @internal
+ */
+class QuerySerializer
+{
+    use EndpointV2SerializerTrait;
+
+    private $endpoint;
+    private $api;
+    private $paramBuilder;
+
+    public function __construct(
+        Service $api,
+        $endpoint,
+        callable $paramBuilder = null
+    ) {
+        $this->api = $api;
+        $this->endpoint = $endpoint;
+        $this->paramBuilder = $paramBuilder ?: new QueryParamBuilder();
+    }
+
+    /**
+     * When invoked with an AWS command, returns a serialization array
+     * containing "method", "uri", "headers", and "body" key value pairs.
+     *
+     * @param CommandInterface $command Command to serialize into a request.
+     * @param $endpointProvider Provider used for dynamic endpoint resolution.
+     * @param $clientArgs Client arguments used for dynamic endpoint resolution.
+     *
+     * @return RequestInterface
+     */
+    public function __invoke(
+        CommandInterface $command,
+        $endpoint = null
+    )
+    {
+        $operation = $this->api->getOperation($command->getName());
+        $body = [
+            'Action'  => $command->getName(),
+            'Version' => $this->api->getMetadata('apiVersion')
+        ];
+        $commandArgs = $command->toArray();
+
+        // Only build up the parameters when there are parameters to build
+        if ($commandArgs) {
+            $body += call_user_func(
+                $this->paramBuilder,
+                $operation->getInput(),
+                $commandArgs
+            );
+        }
+        $body = http_build_query($body, '', '&', PHP_QUERY_RFC3986);
+        $headers = [
+            'Content-Length' => strlen($body),
+            'Content-Type'   => 'application/x-www-form-urlencoded'
+        ];
+
+        if ($endpoint instanceof RulesetEndpoint) {
+            $this->setEndpointV2RequestOptions($endpoint, $headers);
+        }
+
+        return new Request(
+            'POST',
+            $this->endpoint,
+            $headers,
+            $body
+        );
+    }
+}

+ 42 - 0
vendor/aws/aws-sdk-php/src/Api/Serializer/RestJsonSerializer.php

@@ -0,0 +1,42 @@
+<?php
+namespace Aws\Api\Serializer;
+
+use Aws\Api\Service;
+use Aws\Api\StructureShape;
+
+/**
+ * Serializes requests for the REST-JSON protocol.
+ * @internal
+ */
+class RestJsonSerializer extends RestSerializer
+{
+    /** @var JsonBody */
+    private $jsonFormatter;
+
+    /** @var string */
+    private $contentType;
+
+    /**
+     * @param Service  $api           Service API description
+     * @param string   $endpoint      Endpoint to connect to
+     * @param JsonBody $jsonFormatter Optional JSON formatter to use
+     */
+    public function __construct(
+        Service $api,
+        $endpoint,
+        JsonBody $jsonFormatter = null
+    ) {
+        parent::__construct($api, $endpoint);
+        $this->contentType = JsonBody::getContentType($api);
+        $this->jsonFormatter = $jsonFormatter ?: new JsonBody($api);
+    }
+
+    protected function payload(StructureShape $member, array $value, array &$opts)
+    {
+        $body = isset($value) ?
+            ((string) $this->jsonFormatter->build($member, $value))
+            : "{}";
+        $opts['headers']['Content-Type'] = $this->contentType;
+        $opts['body'] = $body;
+    }
+}

+ 310 - 0
vendor/aws/aws-sdk-php/src/Api/Serializer/RestSerializer.php

@@ -0,0 +1,310 @@
+<?php
+namespace Aws\Api\Serializer;
+
+use Aws\Api\MapShape;
+use Aws\Api\Service;
+use Aws\Api\Operation;
+use Aws\Api\Shape;
+use Aws\Api\StructureShape;
+use Aws\Api\TimestampShape;
+use Aws\CommandInterface;
+use Aws\EndpointV2\EndpointProviderV2;
+use Aws\EndpointV2\EndpointV2SerializerTrait;
+use Aws\EndpointV2\Ruleset\RulesetEndpoint;
+use GuzzleHttp\Psr7;
+use GuzzleHttp\Psr7\Request;
+use GuzzleHttp\Psr7\Uri;
+use GuzzleHttp\Psr7\UriResolver;
+use Psr\Http\Message\RequestInterface;
+
+/**
+ * Serializes HTTP locations like header, uri, payload, etc...
+ * @internal
+ */
+abstract class RestSerializer
+{
+    use EndpointV2SerializerTrait;
+
+    /** @var Service */
+    private $api;
+
+    /** @var Uri */
+    private $endpoint;
+
+    /**
+     * @param Service $api      Service API description
+     * @param string  $endpoint Endpoint to connect to
+     */
+    public function __construct(Service $api, $endpoint)
+    {
+        $this->api = $api;
+        $this->endpoint = Psr7\Utils::uriFor($endpoint);
+    }
+
+    /**
+     * @param CommandInterface $command Command to serialize into a request.
+     * @param $endpointProvider Provider used for dynamic endpoint resolution.
+     * @param $clientArgs Client arguments used for dynamic endpoint resolution.
+     *
+     * @return RequestInterface
+     */
+    public function __invoke(
+        CommandInterface $command,
+        $endpoint = null
+    )
+    {
+        $operation = $this->api->getOperation($command->getName());
+        $commandArgs = $command->toArray();
+        $opts = $this->serialize($operation, $commandArgs);
+        $headers = isset($opts['headers']) ? $opts['headers'] : [];
+
+        if ($endpoint instanceof RulesetEndpoint) {
+            $this->setEndpointV2RequestOptions($endpoint, $headers);
+        }
+
+        $uri = $this->buildEndpoint($operation, $commandArgs, $opts);
+
+        return new Request(
+            $operation['http']['method'],
+            $uri,
+            $headers,
+            isset($opts['body']) ? $opts['body'] : null
+        );
+    }
+
+    /**
+     * Modifies a hash of request options for a payload body.
+     *
+     * @param StructureShape   $member  Member to serialize
+     * @param array            $value   Value to serialize
+     * @param array            $opts    Request options to modify.
+     */
+    abstract protected function payload(
+        StructureShape $member,
+        array $value,
+        array &$opts
+    );
+
+    private function serialize(Operation $operation, array $args)
+    {
+        $opts = [];
+        $input = $operation->getInput();
+
+        // Apply the payload trait if present
+        if ($payload = $input['payload']) {
+            $this->applyPayload($input, $payload, $args, $opts);
+        }
+
+        foreach ($args as $name => $value) {
+            if ($input->hasMember($name)) {
+                $member = $input->getMember($name);
+                $location = $member['location'];
+                if (!$payload && !$location) {
+                    $bodyMembers[$name] = $value;
+                } elseif ($location == 'header') {
+                    $this->applyHeader($name, $member, $value, $opts);
+                } elseif ($location == 'querystring') {
+                    $this->applyQuery($name, $member, $value, $opts);
+                } elseif ($location == 'headers') {
+                    $this->applyHeaderMap($name, $member, $value, $opts);
+                }
+            }
+        }
+
+        if (isset($bodyMembers)) {
+            $this->payload($operation->getInput(), $bodyMembers, $opts);
+        } else if (!isset($opts['body']) && $this->hasPayloadParam($input, $payload)) {
+            $this->payload($operation->getInput(), [], $opts);
+        }
+
+        return $opts;
+    }
+
+    private function applyPayload(StructureShape $input, $name, array $args, array &$opts)
+    {
+        if (!isset($args[$name])) {
+            return;
+        }
+
+        $m = $input->getMember($name);
+
+        if ($m['streaming'] ||
+           ($m['type'] == 'string' || $m['type'] == 'blob')
+        ) {
+            // Streaming bodies or payloads that are strings are
+            // always just a stream of data.
+            $opts['body'] = Psr7\Utils::streamFor($args[$name]);
+            return;
+        }
+
+        $this->payload($m, $args[$name], $opts);
+    }
+
+    private function applyHeader($name, Shape $member, $value, array &$opts)
+    {
+        if ($member->getType() === 'timestamp') {
+            $timestampFormat = !empty($member['timestampFormat'])
+                ? $member['timestampFormat']
+                : 'rfc822';
+            $value = TimestampShape::format($value, $timestampFormat);
+        } elseif ($member->getType() === 'boolean') {
+            $value = $value ? 'true' : 'false';
+        }
+
+        if ($member['jsonvalue']) {
+            $value = json_encode($value);
+            if (empty($value) && JSON_ERROR_NONE !== json_last_error()) {
+                throw new \InvalidArgumentException('Unable to encode the provided value'
+                    . ' with \'json_encode\'. ' . json_last_error_msg());
+            }
+
+            $value = base64_encode($value);
+        }
+
+        $opts['headers'][$member['locationName'] ?: $name] = $value;
+    }
+
+    /**
+     * Note: This is currently only present in the Amazon S3 model.
+     */
+    private function applyHeaderMap($name, Shape $member, array $value, array &$opts)
+    {
+        $prefix = $member['locationName'];
+        foreach ($value as $k => $v) {
+            $opts['headers'][$prefix . $k] = $v;
+        }
+    }
+
+    private function applyQuery($name, Shape $member, $value, array &$opts)
+    {
+        if ($member instanceof MapShape) {
+            $opts['query'] = isset($opts['query']) && is_array($opts['query'])
+                ? $opts['query'] + $value
+                : $value;
+        } elseif ($value !== null) {
+            $type = $member->getType();
+            if ($type === 'boolean') {
+                $value = $value ? 'true' : 'false';
+            } elseif ($type === 'timestamp') {
+                $timestampFormat = !empty($member['timestampFormat'])
+                    ? $member['timestampFormat']
+                    : 'iso8601';
+                $value = TimestampShape::format($value, $timestampFormat);
+            }
+
+            $opts['query'][$member['locationName'] ?: $name] = $value;
+        }
+    }
+
+    private function buildEndpoint(Operation $operation, array $args, array $opts)
+    {
+        // Create an associative array of variable definitions used in expansions
+        $varDefinitions = $this->getVarDefinitions($operation, $args);
+
+        $relative = preg_replace_callback(
+            '/\{([^\}]+)\}/',
+            function (array $matches) use ($varDefinitions) {
+                $isGreedy = substr($matches[1], -1, 1) == '+';
+                $k = $isGreedy ? substr($matches[1], 0, -1) : $matches[1];
+                if (!isset($varDefinitions[$k])) {
+                    return '';
+                }
+
+                if ($isGreedy) {
+                    return str_replace('%2F', '/', rawurlencode($varDefinitions[$k]));
+                }
+
+                return rawurlencode($varDefinitions[$k]);
+            },
+            $operation['http']['requestUri']
+        );
+
+        // Add the query string variables or appending to one if needed.
+        if (!empty($opts['query'])) {
+           $relative = $this->appendQuery($opts['query'], $relative);
+        }
+
+        $path = $this->endpoint->getPath();
+
+        //Accounts for trailing '/' in path when custom endpoint
+        //is provided to endpointProviderV2
+        if ($this->api->isModifiedModel()
+            && $this->api->getServiceName() === 's3'
+        ) {
+            if (substr($path, -1) === '/' && $relative[0] === '/') {
+                $path = rtrim($path, '/');
+            }
+            $relative = $path . $relative;
+
+            if (strpos($relative, '../') !== false
+                || substr($relative, -2) === '..'
+            ) {
+                if ($relative[0] !== '/') {
+                    $relative = '/' . $relative;
+                }
+
+                return new Uri($this->endpoint->withPath('') . $relative);
+            }
+        }
+        // If endpoint has path, remove leading '/' to preserve URI resolution.
+        if ($path && $relative[0] === '/') {
+            $relative = substr($relative, 1);
+        }
+
+        //Append path to endpoint when leading '//...'
+        // present as uri cannot be properly resolved
+        if ($this->api->isModifiedModel()
+            && strpos($relative, '//') === 0
+        ) {
+            return new Uri($this->endpoint . $relative);
+        }
+
+        // Expand path place holders using Amazon's slightly different URI
+        // template syntax.
+        return UriResolver::resolve($this->endpoint, new Uri($relative));
+    }
+
+    /**
+     * @param StructureShape $input
+     */
+    private function hasPayloadParam(StructureShape $input, $payload)
+    {
+        if ($payload) {
+            $potentiallyEmptyTypes = ['blob','string'];
+            if ($this->api->getMetadata('protocol') == 'rest-xml') {
+                $potentiallyEmptyTypes[] = 'structure';
+            }
+            $payloadMember = $input->getMember($payload);
+            if (in_array($payloadMember['type'], $potentiallyEmptyTypes)) {
+                return false;
+            }
+        }
+        foreach ($input->getMembers() as $member) {
+            if (!isset($member['location'])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private function appendQuery($query, $endpoint)
+    {
+        $append = Psr7\Query::build($query);
+        return $endpoint .= strpos($endpoint, '?') !== false ? "&{$append}" : "?{$append}";
+    }
+
+    private function getVarDefinitions($command, $args)
+    {
+        $varDefinitions = [];
+
+        foreach ($command->getInput()->getMembers() as $name => $member) {
+            if ($member['location'] == 'uri') {
+                $varDefinitions[$member['locationName'] ?: $name] =
+                    isset($args[$name])
+                        ? $args[$name]
+                        : null;
+            }
+        }
+        return $varDefinitions;
+    }
+}

+ 48 - 0
vendor/aws/aws-sdk-php/src/Api/Serializer/RestXmlSerializer.php

@@ -0,0 +1,48 @@
+<?php
+namespace Aws\Api\Serializer;
+
+use Aws\Api\StructureShape;
+use Aws\Api\Service;
+
+/**
+ * @internal
+ */
+class RestXmlSerializer extends RestSerializer
+{
+    /** @var XmlBody */
+    private $xmlBody;
+
+    /**
+     * @param Service $api      Service API description
+     * @param string  $endpoint Endpoint to connect to
+     * @param XmlBody $xmlBody  Optional XML formatter to use
+     */
+    public function __construct(
+        Service $api,
+        $endpoint,
+        XmlBody $xmlBody = null
+    ) {
+        parent::__construct($api, $endpoint);
+        $this->xmlBody = $xmlBody ?: new XmlBody($api);
+    }
+
+    protected function payload(StructureShape $member, array $value, array &$opts)
+    {
+        $opts['headers']['Content-Type'] = 'application/xml';
+        $opts['body'] = $this->getXmlBody($member, $value);
+    }
+
+    /**
+     * @param StructureShape $member
+     * @param array $value
+     * @return string
+     */
+    private function getXmlBody(StructureShape $member, array $value)
+    {
+        $xmlBody = (string)$this->xmlBody->build($member, $value);
+        $xmlBody = str_replace("'", "&apos;", $xmlBody);
+        $xmlBody = str_replace('\r', "&#13;", $xmlBody);
+        $xmlBody = str_replace('\n', "&#10;", $xmlBody);
+        return $xmlBody;
+    }
+}

+ 220 - 0
vendor/aws/aws-sdk-php/src/Api/Serializer/XmlBody.php

@@ -0,0 +1,220 @@
+<?php
+namespace Aws\Api\Serializer;
+
+use Aws\Api\MapShape;
+use Aws\Api\Service;
+use Aws\Api\Shape;
+use Aws\Api\StructureShape;
+use Aws\Api\ListShape;
+use Aws\Api\TimestampShape;
+use XMLWriter;
+
+/**
+ * @internal Formats the XML body of a REST-XML services.
+ */
+class XmlBody
+{
+    /** @var \Aws\Api\Service */
+    private $api;
+
+    /**
+     * @param Service $api API being used to create the XML body.
+     */
+    public function __construct(Service $api)
+    {
+        $this->api = $api;
+    }
+
+    /**
+     * Builds the XML body based on an array of arguments.
+     *
+     * @param Shape $shape Operation being constructed
+     * @param array $args  Associative array of arguments
+     *
+     * @return string
+     */
+    public function build(Shape $shape, array $args)
+    {
+        $xml = new XMLWriter();
+        $xml->openMemory();
+        $xml->startDocument('1.0', 'UTF-8');
+        $this->format($shape, $shape['locationName'] ?: $shape['name'], $args, $xml);
+        $xml->endDocument();
+
+        return $xml->outputMemory();
+    }
+
+    private function startElement(Shape $shape, $name, XMLWriter $xml)
+    {
+        $xml->startElement($name);
+
+        if ($ns = $shape['xmlNamespace']) {
+            $xml->writeAttribute(
+                isset($ns['prefix']) ? "xmlns:{$ns['prefix']}" : 'xmlns',
+                $shape['xmlNamespace']['uri']
+            );
+        }
+    }
+
+    private function format(Shape $shape, $name, $value, XMLWriter $xml)
+    {
+        // Any method mentioned here has a custom serialization handler.
+        static $methods = [
+            'add_structure' => true,
+            'add_list'      => true,
+            'add_blob'      => true,
+            'add_timestamp' => true,
+            'add_boolean'   => true,
+            'add_map'       => true,
+            'add_string'    => true
+        ];
+
+        $type = 'add_' . $shape['type'];
+        if (isset($methods[$type])) {
+            $this->{$type}($shape, $name, $value, $xml);
+        } else {
+            $this->defaultShape($shape, $name, $value, $xml);
+        }
+    }
+
+    private function defaultShape(Shape $shape, $name, $value, XMLWriter $xml)
+    {
+        $this->startElement($shape, $name, $xml);
+        $xml->text($value);
+        $xml->endElement();
+    }
+
+    private function add_structure(
+        StructureShape $shape,
+        $name,
+        array $value,
+        \XMLWriter $xml
+    ) {
+        $this->startElement($shape, $name, $xml);
+
+        foreach ($this->getStructureMembers($shape, $value) as $k => $definition) {
+            $this->format(
+                $definition['member'],
+                $definition['member']['locationName'] ?: $k,
+                $definition['value'],
+                $xml
+            );
+        }
+
+        $xml->endElement();
+    }
+
+    private function getStructureMembers(StructureShape $shape, array $value)
+    {
+        $members = [];
+
+        foreach ($value as $k => $v) {
+            if ($v !== null && $shape->hasMember($k)) {
+                $definition = [
+                    'member' => $shape->getMember($k),
+                    'value'  => $v,
+                ];
+
+                if ($definition['member']['xmlAttribute']) {
+                    // array_unshift_associative
+                    $members = [$k => $definition] + $members;
+                } else {
+                    $members[$k] = $definition;
+                }
+            }
+        }
+
+        return $members;
+    }
+
+    private function add_list(
+        ListShape $shape,
+        $name,
+        array $value,
+        XMLWriter $xml
+    ) {
+        $items = $shape->getMember();
+
+        if ($shape['flattened']) {
+            $elementName = $name;
+        } else {
+            $this->startElement($shape, $name, $xml);
+            $elementName = $items['locationName'] ?: 'member';
+        }
+
+        foreach ($value as $v) {
+            $this->format($items, $elementName, $v, $xml);
+        }
+
+        if (!$shape['flattened']) {
+            $xml->endElement();
+        }
+    }
+
+    private function add_map(
+        MapShape $shape,
+        $name,
+        array $value,
+        XMLWriter $xml
+    ) {
+        $xmlEntry = $shape['flattened'] ? $shape['locationName'] : 'entry';
+        $xmlKey = $shape->getKey()['locationName'] ?: 'key';
+        $xmlValue = $shape->getValue()['locationName'] ?: 'value';
+
+        $this->startElement($shape, $name, $xml);
+
+        foreach ($value as $key => $v) {
+            $this->startElement($shape, $xmlEntry, $xml);
+            $this->format($shape->getKey(), $xmlKey, $key, $xml);
+            $this->format($shape->getValue(), $xmlValue, $v, $xml);
+            $xml->endElement();
+        }
+
+        $xml->endElement();
+    }
+
+    private function add_blob(Shape $shape, $name, $value, XMLWriter $xml)
+    {
+        $this->startElement($shape, $name, $xml);
+        $xml->writeRaw(base64_encode($value));
+        $xml->endElement();
+    }
+
+    private function add_timestamp(
+        TimestampShape $shape,
+        $name,
+        $value,
+        XMLWriter $xml
+    ) {
+        $this->startElement($shape, $name, $xml);
+        $timestampFormat = !empty($shape['timestampFormat'])
+            ? $shape['timestampFormat']
+            : 'iso8601';
+        $xml->writeRaw(TimestampShape::format($value, $timestampFormat));
+        $xml->endElement();
+    }
+
+    private function add_boolean(
+        Shape $shape,
+        $name,
+        $value,
+        XMLWriter $xml
+    ) {
+        $this->startElement($shape, $name, $xml);
+        $xml->writeRaw($value ? 'true' : 'false');
+        $xml->endElement();
+    }
+
+    private function add_string(
+        Shape $shape,
+        $name,
+        $value,
+        XMLWriter $xml
+    ) {
+        if ($shape['xmlAttribute']) {
+            $xml->writeAttribute($shape['locationName'] ?: $name, $value);
+        } else {
+            $this->defaultShape($shape, $name, $value, $xml);
+        }
+    }
+}

+ 535 - 0
vendor/aws/aws-sdk-php/src/Api/Service.php

@@ -0,0 +1,535 @@
+<?php
+namespace Aws\Api;
+
+/**
+ * Represents a web service API model.
+ */
+class Service extends AbstractModel
+{
+    /** @var callable */
+    private $apiProvider;
+
+    /** @var string */
+    private $serviceName;
+
+    /** @var string */
+    private $apiVersion;
+
+    /** @var array */
+    private $clientContextParams = [];
+
+    /** @var Operation[] */
+    private $operations = [];
+
+    /** @var array */
+    private $paginators = null;
+
+    /** @var array */
+    private $waiters = null;
+
+    /** @var boolean */
+    private $modifiedModel = false;
+
+    /**
+     * @param array    $definition
+     * @param callable $provider
+     *
+     * @internal param array $definition Service description
+     */
+    public function __construct(array $definition, callable $provider)
+    {
+        static $defaults = [
+            'operations' => [],
+            'shapes'     => [],
+            'metadata'   => [],
+            'clientContextParams' => []
+        ], $defaultMeta = [
+            'apiVersion'       => null,
+            'serviceFullName'  => null,
+            'serviceId'        => null,
+            'endpointPrefix'   => null,
+            'signingName'      => null,
+            'signatureVersion' => null,
+            'protocol'         => null,
+            'uid'              => null
+        ];
+
+        $definition += $defaults;
+        $definition['metadata'] += $defaultMeta;
+        $this->definition = $definition;
+        $this->apiProvider = $provider;
+        parent::__construct($definition, new ShapeMap($definition['shapes']));
+
+        if (isset($definition['metadata']['serviceIdentifier'])) {
+            $this->serviceName = $this->getServiceName();
+        } else {
+            $this->serviceName = $this->getEndpointPrefix();
+        }
+        $this->apiVersion = $this->getApiVersion();
+        if (isset($definition['clientContextParams'])) {
+           $this->clientContextParams = $definition['clientContextParams'];
+        }
+    }
+
+    /**
+     * Creates a request serializer for the provided API object.
+     *
+     * @param Service $api      API that contains a protocol.
+     * @param string  $endpoint Endpoint to send requests to.
+     *
+     * @return callable
+     * @throws \UnexpectedValueException
+     */
+    public static function createSerializer(Service $api, $endpoint)
+    {
+        static $mapping = [
+            'json'      => Serializer\JsonRpcSerializer::class,
+            'query'     => Serializer\QuerySerializer::class,
+            'rest-json' => Serializer\RestJsonSerializer::class,
+            'rest-xml'  => Serializer\RestXmlSerializer::class
+        ];
+
+        $proto = $api->getProtocol();
+
+        if (isset($mapping[$proto])) {
+            return new $mapping[$proto]($api, $endpoint);
+        }
+
+        if ($proto == 'ec2') {
+            return new Serializer\QuerySerializer($api, $endpoint, new Serializer\Ec2ParamBuilder());
+        }
+
+        throw new \UnexpectedValueException(
+            'Unknown protocol: ' . $api->getProtocol()
+        );
+    }
+
+    /**
+     * Creates an error parser for the given protocol.
+     *
+     * Redundant method signature to preserve backwards compatibility.
+     *
+     * @param string $protocol Protocol to parse (e.g., query, json, etc.)
+     *
+     * @return callable
+     * @throws \UnexpectedValueException
+     */
+    public static function createErrorParser($protocol, Service $api = null)
+    {
+        static $mapping = [
+            'json'      => ErrorParser\JsonRpcErrorParser::class,
+            'query'     => ErrorParser\XmlErrorParser::class,
+            'rest-json' => ErrorParser\RestJsonErrorParser::class,
+            'rest-xml'  => ErrorParser\XmlErrorParser::class,
+            'ec2'       => ErrorParser\XmlErrorParser::class
+        ];
+
+        if (isset($mapping[$protocol])) {
+            return new $mapping[$protocol]($api);
+        }
+
+        throw new \UnexpectedValueException("Unknown protocol: $protocol");
+    }
+
+    /**
+     * Applies the listeners needed to parse client models.
+     *
+     * @param Service $api API to create a parser for
+     * @return callable
+     * @throws \UnexpectedValueException
+     */
+    public static function createParser(Service $api)
+    {
+        static $mapping = [
+            'json'      => Parser\JsonRpcParser::class,
+            'query'     => Parser\QueryParser::class,
+            'rest-json' => Parser\RestJsonParser::class,
+            'rest-xml'  => Parser\RestXmlParser::class
+        ];
+
+        $proto = $api->getProtocol();
+        if (isset($mapping[$proto])) {
+            return new $mapping[$proto]($api);
+        }
+
+        if ($proto == 'ec2') {
+            return new Parser\QueryParser($api, null, false);
+        }
+
+        throw new \UnexpectedValueException(
+            'Unknown protocol: ' . $api->getProtocol()
+        );
+    }
+
+    /**
+     * Get the full name of the service
+     *
+     * @return string
+     */
+    public function getServiceFullName()
+    {
+        return $this->definition['metadata']['serviceFullName'];
+    }
+
+    /**
+     * Get the service id
+     *
+     * @return string
+     */
+    public function getServiceId()
+    {
+        return $this->definition['metadata']['serviceId'];
+    }
+
+    /**
+     * Get the API version of the service
+     *
+     * @return string
+     */
+    public function getApiVersion()
+    {
+        return $this->definition['metadata']['apiVersion'];
+    }
+
+    /**
+     * Get the API version of the service
+     *
+     * @return string
+     */
+    public function getEndpointPrefix()
+    {
+        return $this->definition['metadata']['endpointPrefix'];
+    }
+
+    /**
+     * Get the signing name used by the service.
+     *
+     * @return string
+     */
+    public function getSigningName()
+    {
+        return $this->definition['metadata']['signingName']
+            ?: $this->definition['metadata']['endpointPrefix'];
+    }
+
+    /**
+     * Get the service name.
+     *
+     * @return string
+     */
+    public function getServiceName()
+    {
+        return $this->definition['metadata']['serviceIdentifier'];
+    }
+
+    /**
+     * Get the default signature version of the service.
+     *
+     * Note: this method assumes "v4" when not specified in the model.
+     *
+     * @return string
+     */
+    public function getSignatureVersion()
+    {
+        return $this->definition['metadata']['signatureVersion'] ?: 'v4';
+    }
+
+    /**
+     * Get the protocol used by the service.
+     *
+     * @return string
+     */
+    public function getProtocol()
+    {
+        return $this->definition['metadata']['protocol'];
+    }
+
+    /**
+     * Get the uid string used by the service
+     *
+     * @return string
+     */
+    public function getUid()
+    {
+        return $this->definition['metadata']['uid'];
+    }
+
+    /**
+     * Check if the description has a specific operation by name.
+     *
+     * @param string $name Operation to check by name
+     *
+     * @return bool
+     */
+    public function hasOperation($name)
+    {
+        return isset($this['operations'][$name]);
+    }
+
+    /**
+     * Get an operation by name.
+     *
+     * @param string $name Operation to retrieve by name
+     *
+     * @return Operation
+     * @throws \InvalidArgumentException If the operation is not found
+     */
+    public function getOperation($name)
+    {
+        if (!isset($this->operations[$name])) {
+            if (!isset($this->definition['operations'][$name])) {
+                throw new \InvalidArgumentException("Unknown operation: $name");
+            }
+            $this->operations[$name] = new Operation(
+                $this->definition['operations'][$name],
+                $this->shapeMap
+            );
+        } else if ($this->modifiedModel) {
+            $this->operations[$name] = new Operation(
+                $this->definition['operations'][$name],
+                $this->shapeMap
+            );
+        }
+
+        return $this->operations[$name];
+    }
+
+    /**
+     * Get all of the operations of the description.
+     *
+     * @return Operation[]
+     */
+    public function getOperations()
+    {
+        $result = [];
+        foreach ($this->definition['operations'] as $name => $definition) {
+            $result[$name] = $this->getOperation($name);
+        }
+
+        return $result;
+    }
+
+    /**
+     * Get all of the error shapes of the service
+     *
+     * @return array
+     */
+    public function getErrorShapes()
+    {
+        $result = [];
+        foreach ($this->definition['shapes'] as $name => $definition) {
+            if (!empty($definition['exception'])) {
+                $definition['name'] = $name;
+                $result[] = new StructureShape($definition, $this->getShapeMap());
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Get all of the service metadata or a specific metadata key value.
+     *
+     * @param string|null $key Key to retrieve or null to retrieve all metadata
+     *
+     * @return mixed Returns the result or null if the key is not found
+     */
+    public function getMetadata($key = null)
+    {
+        if (!$key) {
+            return $this['metadata'];
+        }
+
+        if (isset($this->definition['metadata'][$key])) {
+            return $this->definition['metadata'][$key];
+        }
+
+        return null;
+    }
+
+    /**
+     * Gets an associative array of available paginator configurations where
+     * the key is the name of the paginator, and the value is the paginator
+     * configuration.
+     *
+     * @return array
+     * @unstable The configuration format of paginators may change in the future
+     */
+    public function getPaginators()
+    {
+        if (!isset($this->paginators)) {
+            $res = call_user_func(
+                $this->apiProvider,
+                'paginator',
+                $this->serviceName,
+                $this->apiVersion
+            );
+            $this->paginators = isset($res['pagination'])
+                ? $res['pagination']
+                : [];
+        }
+
+        return $this->paginators;
+    }
+
+    /**
+     * Determines if the service has a paginator by name.
+     *
+     * @param string $name Name of the paginator.
+     *
+     * @return bool
+     */
+    public function hasPaginator($name)
+    {
+        return isset($this->getPaginators()[$name]);
+    }
+
+    /**
+     * Retrieve a paginator by name.
+     *
+     * @param string $name Paginator to retrieve by name. This argument is
+     *                     typically the operation name.
+     * @return array
+     * @throws \UnexpectedValueException if the paginator does not exist.
+     * @unstable The configuration format of paginators may change in the future
+     */
+    public function getPaginatorConfig($name)
+    {
+        static $defaults = [
+            'input_token'  => null,
+            'output_token' => null,
+            'limit_key'    => null,
+            'result_key'   => null,
+            'more_results' => null,
+        ];
+
+        if ($this->hasPaginator($name)) {
+            return $this->paginators[$name] + $defaults;
+        }
+
+        throw new \UnexpectedValueException("There is no {$name} "
+            . "paginator defined for the {$this->serviceName} service.");
+    }
+
+    /**
+     * Gets an associative array of available waiter configurations where the
+     * key is the name of the waiter, and the value is the waiter
+     * configuration.
+     *
+     * @return array
+     */
+    public function getWaiters()
+    {
+        if (!isset($this->waiters)) {
+            $res = call_user_func(
+                $this->apiProvider,
+                'waiter',
+                $this->serviceName,
+                $this->apiVersion
+            );
+            $this->waiters = isset($res['waiters'])
+                ? $res['waiters']
+                : [];
+        }
+
+        return $this->waiters;
+    }
+
+    /**
+     * Determines if the service has a waiter by name.
+     *
+     * @param string $name Name of the waiter.
+     *
+     * @return bool
+     */
+    public function hasWaiter($name)
+    {
+        return isset($this->getWaiters()[$name]);
+    }
+
+    /**
+     * Get a waiter configuration by name.
+     *
+     * @param string $name Name of the waiter by name.
+     *
+     * @return array
+     * @throws \UnexpectedValueException if the waiter does not exist.
+     */
+    public function getWaiterConfig($name)
+    {
+        // Error if the waiter is not defined
+        if ($this->hasWaiter($name)) {
+            return $this->waiters[$name];
+        }
+
+        throw new \UnexpectedValueException("There is no {$name} waiter "
+            . "defined for the {$this->serviceName} service.");
+    }
+
+    /**
+     * Get the shape map used by the API.
+     *
+     * @return ShapeMap
+     */
+    public function getShapeMap()
+    {
+        return $this->shapeMap;
+    }
+
+    /**
+     * Get all the context params of the description.
+     *
+     * @return array
+     */
+    public function getClientContextParams()
+    {
+        return $this->clientContextParams;
+    }
+
+    /**
+     * Get the service's api provider.
+     *
+     * @return callable
+     */
+    public function getProvider()
+    {
+        return $this->apiProvider;
+    }
+
+    /**
+     * Get the service's definition.
+     *
+     * @return callable
+     */
+    public function getDefinition()
+    {
+        return $this->definition;
+    }
+
+    /**
+     * Sets the service's api definition.
+     * Intended for internal use only.
+     *
+     * @return void
+     *
+     * @internal
+     */
+    public function setDefinition($definition)
+    {
+        $this->definition = $definition;
+        $this->modifiedModel = true;
+    }
+
+    /**
+     * Denotes whether or not a service's definition has
+     * been modified.  Intended for internal use only.
+     *
+     * @return bool
+     *
+     * @internal
+     */
+    public function isModifiedModel()
+    {
+        return $this->modifiedModel;
+    }
+}

+ 77 - 0
vendor/aws/aws-sdk-php/src/Api/Shape.php

@@ -0,0 +1,77 @@
+<?php
+namespace Aws\Api;
+
+/**
+ * Base class representing a modeled shape.
+ */
+class Shape extends AbstractModel
+{
+    /**
+     * Get a concrete shape for the given definition.
+     *
+     * @param array    $definition
+     * @param ShapeMap $shapeMap
+     *
+     * @return mixed
+     * @throws \RuntimeException if the type is invalid
+     */
+    public static function create(array $definition, ShapeMap $shapeMap)
+    {
+        static $map = [
+            'structure' => StructureShape::class,
+            'map'       => MapShape::class,
+            'list'      => ListShape::class,
+            'timestamp' => TimestampShape::class,
+            'integer'   => Shape::class,
+            'double'    => Shape::class,
+            'float'     => Shape::class,
+            'long'      => Shape::class,
+            'string'    => Shape::class,
+            'byte'      => Shape::class,
+            'character' => Shape::class,
+            'blob'      => Shape::class,
+            'boolean'   => Shape::class
+        ];
+
+        if (isset($definition['shape'])) {
+            return $shapeMap->resolve($definition);
+        }
+
+        if (!isset($map[$definition['type']])) {
+            throw new \RuntimeException('Invalid type: '
+                . print_r($definition, true));
+        }
+
+        $type = $map[$definition['type']];
+
+        return new $type($definition, $shapeMap);
+    }
+
+    /**
+     * Get the type of the shape
+     *
+     * @return string
+     */
+    public function getType()
+    {
+        return $this->definition['type'];
+    }
+
+    /**
+     * Get the name of the shape
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->definition['name'];
+    }
+
+    /**
+     * Get a context param definition.
+     */
+    public function getContextParam()
+    {
+        return $this->contextParam;
+    }
+}

+ 68 - 0
vendor/aws/aws-sdk-php/src/Api/ShapeMap.php

@@ -0,0 +1,68 @@
+<?php
+namespace Aws\Api;
+
+/**
+ * Builds shape based on shape references.
+ */
+class ShapeMap
+{
+    /** @var array */
+    private $definitions;
+
+    /** @var Shape[] */
+    private $simple;
+
+    /**
+     * @param array $shapeModels Associative array of shape definitions.
+     */
+    public function __construct(array $shapeModels)
+    {
+        $this->definitions = $shapeModels;
+    }
+
+    /**
+     * Get an array of shape names.
+     *
+     * @return array
+     */
+    public function getShapeNames()
+    {
+        return array_keys($this->definitions);
+    }
+
+    /**
+     * Resolve a shape reference
+     *
+     * @param array $shapeRef Shape reference shape
+     *
+     * @return Shape
+     * @throws \InvalidArgumentException
+     */
+    public function resolve(array $shapeRef)
+    {
+        $shape = $shapeRef['shape'];
+
+        if (!isset($this->definitions[$shape])) {
+            throw new \InvalidArgumentException('Shape not found: ' . $shape);
+        }
+
+        $isSimple = count($shapeRef) == 1;
+        if ($isSimple && isset($this->simple[$shape])) {
+            return $this->simple[$shape];
+        }
+
+        $definition = $shapeRef + $this->definitions[$shape];
+        $definition['name'] = $definition['shape'];
+        if (isset($definition['shape'])) {
+            unset($definition['shape']);
+        }
+
+        $result = Shape::create($definition, $this);
+
+        if ($isSimple) {
+            $this->simple[$shape] = $result;
+        }
+
+        return $result;
+    }
+}

+ 79 - 0
vendor/aws/aws-sdk-php/src/Api/StructureShape.php

@@ -0,0 +1,79 @@
+<?php
+namespace Aws\Api;
+
+/**
+ * Represents a structure shape and resolve member shape references.
+ */
+class StructureShape extends Shape
+{
+    /**
+     * @var Shape[]
+     */
+    private $members;
+
+    public function __construct(array $definition, ShapeMap $shapeMap)
+    {
+        $definition['type'] = 'structure';
+
+        if (!isset($definition['members'])) {
+            $definition['members'] = [];
+        }
+
+        parent::__construct($definition, $shapeMap);
+    }
+
+    /**
+     * Gets a list of all members
+     *
+     * @return Shape[]
+     */
+    public function getMembers()
+    {
+        if (empty($this->members)) {
+            $this->generateMembersHash();
+        }
+
+        return $this->members;
+    }
+
+    /**
+     * Check if a specific member exists by name.
+     *
+     * @param string $name Name of the member to check
+     *
+     * @return bool
+     */
+    public function hasMember($name)
+    {
+        return isset($this->definition['members'][$name]);
+    }
+
+    /**
+     * Retrieve a member by name.
+     *
+     * @param string $name Name of the member to retrieve
+     *
+     * @return Shape
+     * @throws \InvalidArgumentException if the member is not found.
+     */
+    public function getMember($name)
+    {
+        $members = $this->getMembers();
+
+        if (!isset($members[$name])) {
+            throw new \InvalidArgumentException('Unknown member ' . $name);
+        }
+
+        return $members[$name];
+    }
+
+
+    private function generateMembersHash()
+    {
+        $this->members = [];
+
+        foreach ($this->definition['members'] as $name => $definition) {
+            $this->members[$name] = $this->shapeFor($definition);
+        }
+    }
+}

+ 48 - 0
vendor/aws/aws-sdk-php/src/Api/TimestampShape.php

@@ -0,0 +1,48 @@
+<?php
+namespace Aws\Api;
+
+/**
+ * Represents a timestamp shape.
+ */
+class TimestampShape extends Shape
+{
+    public function __construct(array $definition, ShapeMap $shapeMap)
+    {
+        $definition['type'] = 'timestamp';
+        parent::__construct($definition, $shapeMap);
+    }
+
+    /**
+     * Formats a timestamp value for a service.
+     *
+     * @param mixed  $value  Value to format
+     * @param string $format Format used to serialize the value
+     *
+     * @return int|string
+     * @throws \UnexpectedValueException if the format is unknown.
+     * @throws \InvalidArgumentException if the value is an unsupported type.
+     */
+    public static function format($value, $format)
+    {
+        if ($value instanceof \DateTimeInterface) {
+            $value = $value->getTimestamp();
+        } elseif (is_string($value)) {
+            $value = strtotime($value);
+        } elseif (!is_int($value)) {
+            throw new \InvalidArgumentException('Unable to handle the provided'
+                . ' timestamp type: ' . gettype($value));
+        }
+
+        switch ($format) {
+            case 'iso8601':
+                return gmdate('Y-m-d\TH:i:s\Z', $value);
+            case 'rfc822':
+                return gmdate('D, d M Y H:i:s \G\M\T', $value);
+            case 'unixTimestamp':
+                return $value;
+            default:
+                throw new \UnexpectedValueException('Unknown timestamp format: '
+                    . $format);
+        }
+    }
+}

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác