diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index ea5eb8d..2ebbab4 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -2,15 +2,654 @@
 <project version="4">
   <component name="ChangeListManager">
     <list default="true" id="e93f11c2-a7d9-4d35-8b1c-8dd18e7f5fef" name="Default" comment="">
-      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/application/api/controller/Pay.php" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/application/api/controller/Ems.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/.coveralls.yml" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/.travis.yml" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/UPGRADE.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/build.properties" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/build.xml" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/phpunit.xml.dist" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/BaseFileCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheProviderTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ChainCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CouchbaseCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FileCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FilesystemCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MongoDBCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PhpFileCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PredisCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RedisCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RiakCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/SQLite3CacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/VoidCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/DoctrineTestCase.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/Doctrine/Tests/TestInit.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/travis/php.ini" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/doctrine/cache/tests/travis/phpunit.travis.xml" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/.php_cs" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/doc/01-usage.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/doc/03-utilities.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/doc/04-extending.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/doc/sockets.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/phpunit.xml.dist" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Formatter/FlowdockFormatterTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Formatter/LogglyFormatterTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Formatter/MongoDBFormatterTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/DeduplicationHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/FilterHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/FleepHookHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/FlowdockHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerLegacyTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/GelfMockMessagePublisher.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/HandlerWrapperTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/InsightOpsHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/PHPConsoleHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/PsrHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/RollbarHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/SamplingHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/SlackHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/SlackWebhookHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/SlackbotHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/SwiftMailerHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/LoggerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Processor/MercurialProcessorTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Processor/PsrLogMessageProcessorTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Processor/TagProcessorTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/RegistryTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/SignalHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/tests/Monolog/TestCase.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Providers/WeChatOpenPlatformProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/.phplint.yml" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/.styleci.yml" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/BACKERS.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Broadcast/Broadcast.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Broadcast/LICENSE.txt" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Broadcast/MessageBuilder.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Broadcast/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Broadcast/Transformer.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Broadcast/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Card/Card.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Card/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Card/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Card/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Comment/Comment.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Core/AbstractAPI.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Core/AccessToken.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Core/Exception.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Core/Exceptions/FaultException.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Core/Exceptions/HttpException.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Core/Exceptions/InvalidArgumentException.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Core/Exceptions/InvalidConfigException.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Core/Exceptions/RuntimeException.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Core/Exceptions/UnboundServiceException.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Core/Http.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Core/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Core/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Core/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Device/Device.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Device/DeviceHttpException.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Device/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Device/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Device/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Encryption/EncryptionException.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Encryption/Encryptor.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Encryption/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/Application.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/Config.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/BroadcastServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/CardServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/CommentServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/DeviceServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/FundamentalServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/JsServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/MaterialServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/MenuServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/MiniProgramServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/NoticeServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/OAuthServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/OpenPlatformServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/POIServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/PaymentServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/QRCodeServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/ReplyServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/SemanticServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/ServerServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/ShakeAroundServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/StaffServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/StatsServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/UrlServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Foundation/ServiceProviders/UserServiceProvider.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Fundamental/API.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Js/Js.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Js/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Js/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Js/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Material/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Material/Material.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Material/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Material/Temporary.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Material/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Menu/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Menu/Menu.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Menu/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Menu/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/AbstractMessage.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/Article.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/Card.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/DeviceEvent.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/DeviceText.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/Image.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/Link.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/Location.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/Material.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/MiniProgramPage.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/Music.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/News.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/Raw.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/ShortVideo.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/Text.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/Transfer.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/Video.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/Voice.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Message/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/MiniProgram/AccessToken.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/MiniProgram/Core/AbstractMiniProgram.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/MiniProgram/Encryption/Encryptor.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/MiniProgram/Material/Temporary.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/MiniProgram/MiniProgram.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/MiniProgram/Notice/Notice.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/MiniProgram/QRCode/QRCode.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/MiniProgram/Server/Guard.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/MiniProgram/Sns/Sns.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/MiniProgram/Staff/Staff.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/MiniProgram/Stats/Stats.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Notice/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Notice/Notice.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Notice/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Notice/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/AccessToken.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/Api/AbstractOpenPlatform.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/Api/BaseApi.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/Api/PreAuthorization.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/Authorizer.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/AuthorizerAccessToken.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/Authorized.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/ComponentVerifyTicket.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/EventHandler.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/Unauthorized.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/UpdateAuthorized.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/Guard.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/OpenPlatform.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/OpenPlatform/VerifyTicket.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/POI/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/POI/POI.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/POI/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/POI/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/API.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/CashCoupon/API.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/CashCoupon/CashCoupon.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/LuckyMoney/API.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/LuckyMoney/LuckyMoney.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/Merchant.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/MerchantPay/API.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/MerchantPay/MerchantPay.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/Notify.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/Order.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/Payment.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/RefundNotify.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/helpers.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/QRCode/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/QRCode/QRCode.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/QRCode/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/QRCode/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Reply/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Reply/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Reply/Reply.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Reply/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Semantic/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Semantic/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Semantic/Semantic.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Semantic/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Server/BadRequestException.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Server/Guard.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Server/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Server/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Server/Transformer.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Server/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/ShakeAround/Device.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/ShakeAround/Group.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/ShakeAround/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/ShakeAround/Material.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/ShakeAround/Page.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/ShakeAround/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/ShakeAround/Relation.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/ShakeAround/ShakeAround.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/ShakeAround/Stats.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/ShakeAround/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Staff/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Staff/MessageBuilder.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Staff/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Staff/Session.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Staff/Staff.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Staff/Transformer.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Staff/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Stats/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Stats/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Stats/Stats.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Stats/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Store/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Store/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Store/Store.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Store/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Support/Arr.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Support/Attribute.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Support/Collection.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Support/File.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Support/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Support/Log.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Support/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Support/Str.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Support/Traits/PrefixedContainer.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Support/Url.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Support/XML.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Support/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Url/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Url/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Url/Url.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/Url/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/User/Group.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/User/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/User/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/User/Tag.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/User/User.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/src/User/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/paragonie/random_compat/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/paragonie/random_compat/build-phar.sh" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/paragonie/random_compat/composer.json" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/paragonie/random_compat/lib/random.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/paragonie/random_compat/other/build_phar.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/paragonie/random_compat/psalm-autoload.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/paragonie/random_compat/psalm.xml" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/MemcacheSessionHandler.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/NativeSessionHandler.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/WriteCheckSessionHandler.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Proxy/NativeProxy.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/NativeProxyTest.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-php70/LICENSE" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-php70/Php70.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-php70/README.md" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-php70/Resources/stubs/AssertionError.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-php70/Resources/stubs/Error.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-php70/Resources/stubs/ParseError.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-php70/Resources/stubs/TypeError.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-php70/bootstrap.php" afterPath="" />
+      <change type="DELETED" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-php70/composer.json" afterPath="" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/application/admin/lang/zh-cn/video.php" afterPath="$PROJECT_DIR$/application/admin/lang/zh-cn/video.php" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/application/admin/view/video/add.html" afterPath="$PROJECT_DIR$/application/admin/view/video/add.html" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/application/admin/view/video/edit.html" afterPath="$PROJECT_DIR$/application/admin/view/video/edit.html" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/application/api/controller/Pay.php" afterPath="$PROJECT_DIR$/application/api/controller/Pay.php" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/application/api/controller/User.php" afterPath="$PROJECT_DIR$/application/api/controller/User.php" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/application/extra/verify.php" afterPath="$PROJECT_DIR$/application/extra/verify.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/composer.json" afterPath="$PROJECT_DIR$/composer.json" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/public/api.html" afterPath="$PROJECT_DIR$/public/api.html" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/public/assets/js/backend/video.js" afterPath="$PROJECT_DIR$/public/assets/js/backend/video.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/public/assets/js/backend/user/user.js" afterPath="$PROJECT_DIR$/public/assets/js/backend/user/user.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/autoload.php" afterPath="$PROJECT_DIR$/vendor/autoload.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/composer/ClassLoader.php" afterPath="$PROJECT_DIR$/vendor/composer/ClassLoader.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/composer/LICENSE" afterPath="$PROJECT_DIR$/vendor/composer/LICENSE" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/composer/autoload_classmap.php" afterPath="$PROJECT_DIR$/vendor/composer/autoload_classmap.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/composer/autoload_files.php" afterPath="$PROJECT_DIR$/vendor/composer/autoload_files.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/composer/autoload_namespaces.php" afterPath="$PROJECT_DIR$/vendor/composer/autoload_namespaces.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/composer/autoload_psr4.php" afterPath="$PROJECT_DIR$/vendor/composer/autoload_psr4.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/composer/autoload_real.php" afterPath="$PROJECT_DIR$/vendor/composer/autoload_real.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/composer/autoload_static.php" afterPath="$PROJECT_DIR$/vendor/composer/autoload_static.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/composer/installed.json" afterPath="$PROJECT_DIR$/vendor/composer/installed.json" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/CHANGELOG.md" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/CHANGELOG.md" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/README.md" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/README.md" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/composer.json" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/composer.json" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Client.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Client.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/ClientInterface.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/ClientInterface.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/HandlerStack.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/HandlerStack.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Middleware.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Middleware.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Pool.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Pool.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/RequestOptions.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/RequestOptions.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/TransferStats.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/TransferStats.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/functions.php" afterPath="$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/functions.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/CHANGELOG.md" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/CHANGELOG.md" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/LICENSE" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/LICENSE" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/README.md" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/README.md" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/composer.json" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/composer.json" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/ErrorHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/ErrorHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Logger.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Logger.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Registry.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Registry.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/ResettableInterface.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/ResettableInterface.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/SignalHandler.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/SignalHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Utils.php" afterPath="$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Utils.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/.travis.yml" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/.travis.yml" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/README.md" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/README.md" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/composer.json" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/composer.json" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/src/AuthorizeFailedException.php" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/src/AuthorizeFailedException.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Config.php" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Config.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Providers/AbstractProvider.php" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Providers/AbstractProvider.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Providers/FacebookProvider.php" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Providers/FacebookProvider.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Providers/GoogleProvider.php" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Providers/GoogleProvider.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Providers/LinkedinProvider.php" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Providers/LinkedinProvider.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Providers/QQProvider.php" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Providers/QQProvider.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Providers/WeChatProvider.php" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/src/Providers/WeChatProvider.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/src/SocialiteManager.php" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/src/SocialiteManager.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/src/User.php" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/src/User.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/tests/OAuthTest.php" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/tests/OAuthTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/tests/Providers/WeWorkProviderTest.php" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/tests/Providers/WeWorkProviderTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/socialite/tests/WechatProviderTest.php" afterPath="$PROJECT_DIR$/vendor/overtrue/socialite/tests/WechatProviderTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/LICENSE" afterPath="$PROJECT_DIR$/vendor/overtrue/wechat/LICENSE" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/README.md" afterPath="$PROJECT_DIR$/vendor/overtrue/wechat/README.md" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/overtrue/wechat/composer.json" afterPath="$PROJECT_DIR$/vendor/overtrue/wechat/composer.json" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/psr/log/Psr/Log/LoggerInterface.php" afterPath="$PROJECT_DIR$/vendor/psr/log/Psr/Log/LoggerInterface.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/psr/log/Psr/Log/LoggerTrait.php" afterPath="$PROJECT_DIR$/vendor/psr/log/Psr/Log/LoggerTrait.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/psr/log/Psr/Log/NullLogger.php" afterPath="$PROJECT_DIR$/vendor/psr/log/Psr/Log/NullLogger.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php" afterPath="$PROJECT_DIR$/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/psr/log/Psr/Log/Test/TestLogger.php" afterPath="$PROJECT_DIR$/vendor/psr/log/Psr/Log/Test/TestLogger.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/psr/log/README.md" afterPath="$PROJECT_DIR$/vendor/psr/log/README.md" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/psr/log/composer.json" afterPath="$PROJECT_DIR$/vendor/psr/log/composer.json" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/AcceptHeader.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/AcceptHeader.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/AcceptHeaderItem.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/AcceptHeaderItem.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/BinaryFileResponse.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/BinaryFileResponse.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/CHANGELOG.md" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/CHANGELOG.md" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Cookie.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Cookie.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/File.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/File.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesser.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesser.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesserInterface.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesserInterface.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/UploadedFile.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/File/UploadedFile.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/FileBag.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/FileBag.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/HeaderBag.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/HeaderBag.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/JsonResponse.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/JsonResponse.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/ParameterBag.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/ParameterBag.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/RedirectResponse.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/RedirectResponse.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Request.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Request.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/RequestMatcher.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/RequestMatcher.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/RequestStack.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/RequestStack.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Response.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Response.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/ResponseHeaderBag.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/ResponseHeaderBag.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/ServerBag.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/ServerBag.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Flash/FlashBag.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Flash/FlashBag.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/StreamedResponse.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/StreamedResponse.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/AcceptHeaderItemTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/AcceptHeaderItemTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/AcceptHeaderTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/AcceptHeaderTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/BinaryFileResponseTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/BinaryFileResponseTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/CookieTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/CookieTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/ExpressionRequestMatcherTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/ExpressionRequestMatcherTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/File/FileTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/File/FileTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/File/MimeType/MimeTypeTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/File/MimeType/MimeTypeTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/File/UploadedFileTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/File/UploadedFileTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/FileBagTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/FileBagTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.expected" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.expected" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/HeaderBagTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/HeaderBagTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/IpUtilsTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/IpUtilsTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/JsonResponseTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/JsonResponseTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/RedirectResponseTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/RedirectResponseTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/RequestTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/RequestTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/ResponseFunctionalTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/ResponseFunctionalTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/ResponseTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/ResponseTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Flash/AutoExpireFlashBagTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Flash/AutoExpireFlashBagTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Flash/FlashBagTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Flash/FlashBagTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/SessionTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/SessionTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/AbstractSessionHandlerTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/AbstractSessionHandlerTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/common.inc" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/common.inc" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.expected" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.expected" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.expected" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.expected" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/MetadataBagTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/MetadataBagTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/MockArraySessionStorageTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/MockArraySessionStorageTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/StreamedResponseTest.php" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/Tests/StreamedResponseTest.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/http-foundation/composer.json" afterPath="$PROJECT_DIR$/vendor/symfony/http-foundation/composer.json" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-mbstring/Mbstring.php" afterPath="$PROJECT_DIR$/vendor/symfony/polyfill-mbstring/Mbstring.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-mbstring/bootstrap.php" afterPath="$PROJECT_DIR$/vendor/symfony/polyfill-mbstring/bootstrap.php" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/vendor/symfony/polyfill-mbstring/composer.json" afterPath="$PROJECT_DIR$/vendor/symfony/polyfill-mbstring/composer.json" />
     </list>
     <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
     <option name="TRACKING_ENABLED" value="true" />
@@ -21,39 +660,16 @@
   </component>
   <component name="FileEditorManager">
     <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file leaf-file-name="User.php" pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/application/api/controller/User.php">
+      <file leaf-file-name="Pay.php" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/application/api/controller/Pay.php">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="534">
-              <caret line="606" column="5" lean-forward="true" selection-start-line="606" selection-start-column="5" selection-end-line="606" selection-end-column="5" />
+            <state relative-caret-position="259">
+              <caret line="129" column="39" lean-forward="false" selection-start-line="129" selection-start-column="39" selection-end-line="129" selection-end-column="39" />
               <folding>
-                <element signature="e#38#68#0#PHP" expanded="true" />
-                <element signature="e#337#456#0#PHP" expanded="false" />
-                <element signature="e#462#1200#0#PHP" expanded="false" />
-                <element signature="e#1205#2868#0#PHP" expanded="false" />
-                <element signature="e#2874#3402#0#PHP" expanded="false" />
-                <element signature="e#3407#4178#0#PHP" expanded="false" />
-                <element signature="e#4184#4591#0#PHP" expanded="false" />
-                <element signature="e#4596#4939#0#PHP" expanded="false" />
-                <element signature="e#4945#5597#0#PHP" expanded="false" />
-                <element signature="e#5602#7545#0#PHP" expanded="false" />
-                <element signature="e#7551#8000#0#PHP" expanded="false" />
-                <element signature="e#8005#8888#0#PHP" expanded="false" />
-                <element signature="e#8894#9411#0#PHP" expanded="false" />
-                <element signature="e#9416#10415#0#PHP" expanded="false" />
-                <element signature="e#10421#11105#0#PHP" expanded="false" />
-                <element signature="e#11110#12606#0#PHP" expanded="false" />
-                <element signature="e#12612#13482#0#PHP" expanded="false" />
-                <element signature="e#13487#15300#0#PHP" expanded="false" />
-                <element signature="e#15306#15683#0#PHP" expanded="false" />
-                <element signature="e#15688#15952#0#PHP" expanded="false" />
-                <element signature="e#15958#16463#0#PHP" expanded="false" />
-                <element signature="e#16468#16719#0#PHP" expanded="false" />
-                <element signature="e#16725#17204#0#PHP" expanded="false" />
-                <element signature="e#17209#17966#0#PHP" expanded="false" />
-                <element signature="e#17972#18387#0#PHP" expanded="false" />
-                <element signature="e#18392#18900#0#PHP" expanded="false" />
-                <element signature="e#18906#19123#0#PHP" expanded="false" />
+                <element signature="e#450#569#0#PHP" expanded="false" />
+                <element signature="e#575#888#0#PHP" expanded="false" />
+                <element signature="e#893#2938#0#PHP" expanded="false" />
+                <element signature="e#2961#3178#0#PHP" expanded="false" />
               </folding>
             </state>
           </provider>
@@ -105,12 +721,14 @@
         <option value="$PROJECT_DIR$/application/admin/view/pic/add.html" />
         <option value="$PROJECT_DIR$/application/admin/view/pic/edit.html" />
         <option value="$PROJECT_DIR$/application/extra/verify.php" />
-        <option value="$PROJECT_DIR$/application/api/controller/Pay.php" />
         <option value="$PROJECT_DIR$/public/assets/js/backend/video.js" />
         <option value="$PROJECT_DIR$/application/admin/lang/zh-cn/video.php" />
         <option value="$PROJECT_DIR$/application/admin/view/video/add.html" />
         <option value="$PROJECT_DIR$/application/admin/view/video/edit.html" />
+        <option value="$PROJECT_DIR$/composer.json" />
         <option value="$PROJECT_DIR$/application/api/controller/User.php" />
+        <option value="$PROJECT_DIR$/public/assets/js/backend/user/user.js" />
+        <option value="$PROJECT_DIR$/application/api/controller/Pay.php" />
       </list>
     </option>
   </component>
@@ -129,9 +747,9 @@
   </component>
   <component name="PhpWorkspaceProjectConfiguration" backward_compatibility_performed="true" />
   <component name="ProjectFrameBounds" extendedState="1">
-    <option name="x" value="159" />
-    <option name="y" value="20" />
-    <option name="width" value="1722" />
+    <option name="x" value="4" />
+    <option name="y" value="116" />
+    <option name="width" value="1883" />
     <option name="height" value="946" />
   </component>
   <component name="ProjectView">
@@ -149,6 +767,7 @@
       <foldersAlwaysOnTop value="true" />
     </navigator>
     <panes>
+      <pane id="Scope" />
       <pane id="ProjectPane">
         <subPane>
           <expand>
@@ -174,20 +793,61 @@
               <item name="api" type="2a2b976b:PhpTreeStructureProvider$1" />
               <item name="controller" type="2a2b976b:PhpTreeStructureProvider$1" />
             </path>
+            <path>
+              <item name="areial" type="b2602c69:ProjectViewProjectNode" />
+              <item name="areial" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="application" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="extra" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
+            <path>
+              <item name="areial" type="b2602c69:ProjectViewProjectNode" />
+              <item name="areial" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="public" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
+            <path>
+              <item name="areial" type="b2602c69:ProjectViewProjectNode" />
+              <item name="areial" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="public" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="assets" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
+            <path>
+              <item name="areial" type="b2602c69:ProjectViewProjectNode" />
+              <item name="areial" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="public" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="assets" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="js" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
+            <path>
+              <item name="areial" type="b2602c69:ProjectViewProjectNode" />
+              <item name="areial" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="public" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="assets" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="js" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="backend" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
+            <path>
+              <item name="areial" type="b2602c69:ProjectViewProjectNode" />
+              <item name="areial" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="public" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="assets" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="js" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="backend" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="user" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
           </expand>
           <select />
         </subPane>
       </pane>
       <pane id="Scratches" />
-      <pane id="Scope" />
     </panes>
   </component>
   <component name="PropertiesComponent">
     <property name="WebServerToolWindowFactoryState" value="false" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$/../scrap1/scrap" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/../hotel" />
   </component>
   <component name="RecentsManager">
     <key name="CopyFile.RECENT_KEYS">
+      <recent name="D:\htdocs\areial\vendor\overtrue\wechat\src" />
       <recent name="D:\htdocs\areial\application\api\controller" />
       <recent name="D:\htdocs\areial\public" />
       <recent name="D:\htdocs\areial" />
@@ -222,6 +882,7 @@
       <workItem from="1574141466352" duration="745000" />
       <workItem from="1574143209694" duration="3660000" />
       <workItem from="1574146994475" duration="23222000" />
+      <workItem from="1574209189943" duration="8915000" />
     </task>
     <task id="LOCAL-00001" summary="调试">
       <created>1574145133364</created>
@@ -234,7 +895,7 @@
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="71575000" />
+    <option name="totallyTimeSpent" value="80490000" />
   </component>
   <component name="TodoView">
     <todo-panel id="selected-file">
@@ -246,18 +907,16 @@
     </todo-panel>
   </component>
   <component name="ToolWindowManager">
-    <frame x="159" y="20" width="1722" height="946" extended-state="1" />
-    <editor active="true" />
+    <frame x="4" y="116" width="1883" height="946" extended-state="1" />
     <layout>
-      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.17087846" sideWeight="0.5" order="1" side_tool="false" content_ui="combo" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.15743281" sideWeight="0.5" order="1" side_tool="false" content_ui="combo" />
       <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32912987" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
       <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="true" content_ui="tabs" />
       <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
-      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
       <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
       <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
-      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33992583" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Terminal" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.33868974" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
       <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="true" content_ui="tabs" />
       <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
       <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
@@ -265,6 +924,7 @@
       <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
       <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="3" side_tool="false" content_ui="combo" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
       <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
     </layout>
     <layout-to-restore>
@@ -299,67 +959,11 @@
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>
-      <option name="time" value="4" />
+      <option name="time" value="5" />
     </breakpoint-manager>
     <watches-manager />
   </component>
   <component name="editorHistoryManager">
-    <entry file="file://$PROJECT_DIR$/application/admin/view/type/edit.html">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="300">
-          <caret line="12" column="166" lean-forward="false" selection-start-line="12" selection-start-column="166" selection-end-line="12" selection-end-column="166" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/public/assets/js/backend/type.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="500">
-          <caret line="29" column="155" lean-forward="false" selection-start-line="29" selection-start-column="155" selection-end-line="29" selection-end-column="155" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/application/admin/lang/zh-cn/category.php">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/application/common/model/Category.php">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="561">
-          <caret line="56" column="5" lean-forward="true" selection-start-line="56" selection-start-column="5" selection-end-line="56" selection-end-column="5" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/application/admin/view/category/add.html">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="100">
-          <caret line="4" column="10" lean-forward="true" selection-start-line="4" selection-start-column="10" selection-end-line="4" selection-end-column="10" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/application/admin/controller/Category.php">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="485">
-          <caret line="35" column="9" lean-forward="true" selection-start-line="35" selection-start-column="9" selection-end-line="35" selection-end-column="9" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/application/admin/model/Pic.php">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="900">
-          <caret line="36" column="0" lean-forward="false" selection-start-line="36" selection-start-column="0" selection-end-line="36" selection-end-column="0" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/application/admin/model/Wonderful.php">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/public/assets/js/backend/category.js">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="400">
@@ -511,7 +1115,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="-1991">
           <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -548,7 +1151,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="175">
           <caret line="7" column="29" lean-forward="false" selection-start-line="7" selection-start-column="29" selection-end-line="7" selection-end-column="29" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -556,7 +1158,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="511">
           <caret line="34" column="28" lean-forward="true" selection-start-line="34" selection-start-column="28" selection-end-line="34" selection-end-column="28" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -564,15 +1165,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="205">
           <caret line="33" column="10" lean-forward="true" selection-start-line="33" selection-start-column="10" selection-end-line="33" selection-end-column="10" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/public/assets/js/backend/pic.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="200">
-          <caret line="23" column="26" lean-forward="true" selection-start-line="23" selection-start-column="26" selection-end-line="23" selection-end-column="26" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -591,98 +1183,117 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/application/api/controller/Demo.php">
+    <entry file="file://$PROJECT_DIR$/application/api/controller/Demo.php" />
+    <entry file="file://$PROJECT_DIR$/application/api/controller/Ems.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="375">
-          <caret line="21" column="4" lean-forward="true" selection-start-line="21" selection-start-column="4" selection-end-line="39" selection-end-column="7" />
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/application/api/controller/Ems.php">
+    <entry file="file://$PROJECT_DIR$/application/api/controller/Index.php" />
+    <entry file="file://$PROJECT_DIR$/application/admin/controller/Video.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+        <state relative-caret-position="1464">
+          <caret line="169" column="0" lean-forward="true" selection-start-line="169" selection-start-column="0" selection-end-line="169" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/application/api/controller/Index.php">
+    <entry file="file://$PROJECT_DIR$/application/admin/view/video/edit.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
+        <state relative-caret-position="251">
+          <caret line="83" column="10" lean-forward="false" selection-start-line="83" selection-start-column="10" selection-end-line="83" selection-end-column="10" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/application/admin/controller/Video.php">
+    <entry file="file://$PROJECT_DIR$/application/admin/view/video/add.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1464">
-          <caret line="169" column="0" lean-forward="true" selection-start-line="169" selection-start-column="0" selection-end-line="169" selection-end-column="0" />
-          <folding />
+        <state relative-caret-position="101">
+          <caret line="83" column="10" lean-forward="false" selection-start-line="83" selection-start-column="10" selection-end-line="83" selection-end-column="10" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/application/api/controller/Pay.php">
+    <entry file="file://$PROJECT_DIR$/application/admin/lang/zh-cn/video.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="235">
-          <caret line="43" column="37" lean-forward="true" selection-start-line="43" selection-start-column="37" selection-end-line="43" selection-end-column="37" />
-          <folding>
-            <element signature="e#600#719#0#PHP" expanded="false" />
-            <element signature="e#3357#4413#0#PHP" expanded="false" />
-            <element signature="e#4436#5354#0#PHP" expanded="false" />
-            <element signature="e#5361#5826#0#PHP" expanded="false" />
-            <element signature="e#5831#6636#0#PHP" expanded="false" />
-            <element signature="e#6642#7049#0#PHP" expanded="false" />
-            <element signature="e#7054#9439#0#PHP" expanded="false" />
-          </folding>
+        <state relative-caret-position="350">
+          <caret line="14" column="34" lean-forward="false" selection-start-line="14" selection-start-column="34" selection-end-line="14" selection-end-column="34" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/application/extra/verify.php">
+    <entry file="file://$PROJECT_DIR$/public/assets/js/backend/video.js">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="160">
-          <caret line="13" column="43" lean-forward="true" selection-start-line="13" selection-start-column="43" selection-end-line="13" selection-end-column="43" />
+        <state relative-caret-position="475">
+          <caret line="40" column="73" lean-forward="false" selection-start-line="40" selection-start-column="73" selection-end-line="40" selection-end-column="73" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/vendor/overtrue/wechat/composer.json">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/application/admin/view/video/edit.html">
+    <entry file="file://$PROJECT_DIR$/vendor/overtrue/wechat/README.md">
+      <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
+        <state split_layout="SPLIT">
+          <first_editor relative-caret-position="-825">
+            <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+            <folding />
+          </first_editor>
+          <second_editor />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/composer.json">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="251">
-          <caret line="83" column="10" lean-forward="false" selection-start-line="83" selection-start-column="10" selection-end-line="83" selection-end-column="10" />
+        <state relative-caret-position="566">
+          <caret line="26" column="33" lean-forward="false" selection-start-line="26" selection-start-column="33" selection-end-line="26" selection-end-column="33" />
+          <folding>
+            <marker date="1574213237432" expanded="true" signature="384:782" ph="{&quot;php&quot;: &quot;&gt;=5.6.0&quot;...}" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/vendor/overtrue/wechat/src/Factory.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="297">
+          <caret line="25" column="6" lean-forward="false" selection-start-line="25" selection-start-column="6" selection-end-line="25" selection-end-column="6" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/application/admin/view/video/add.html">
+    <entry file="file://$PROJECT_DIR$/vendor/overtrue/wechat/src/Kernel/Support/Helpers.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="101">
-          <caret line="83" column="10" lean-forward="false" selection-start-line="83" selection-start-column="10" selection-end-line="83" selection-end-column="10" />
+        <state relative-caret-position="411">
+          <caret line="28" column="9" lean-forward="false" selection-start-line="28" selection-start-column="9" selection-end-line="28" selection-end-column="9" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/application/admin/lang/zh-cn/video.php">
+    <entry file="file://$PROJECT_DIR$/vendor/overtrue/wechat/src/Payment/Application.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="350">
-          <caret line="14" column="34" lean-forward="false" selection-start-line="14" selection-start-column="34" selection-end-line="14" selection-end-column="34" />
+        <state relative-caret-position="261">
+          <caret line="25" column="58" lean-forward="false" selection-start-line="25" selection-start-column="58" selection-end-line="25" selection-end-column="58" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/public/assets/js/backend/video.js">
+    <entry file="file://$PROJECT_DIR$/application/extra/verify.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="475">
-          <caret line="40" column="73" lean-forward="false" selection-start-line="40" selection-start-column="73" selection-end-line="40" selection-end-column="73" />
+        <state relative-caret-position="344">
+          <caret line="16" column="9" lean-forward="false" selection-start-line="16" selection-start-column="9" selection-end-line="16" selection-end-column="9" />
           <folding />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/application/api/controller/User.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="534">
-          <caret line="606" column="5" lean-forward="true" selection-start-line="606" selection-start-column="5" selection-end-line="606" selection-end-column="5" />
+        <state relative-caret-position="362">
+          <caret line="484" column="7" lean-forward="true" selection-start-line="484" selection-start-column="7" selection-end-line="484" selection-end-column="7" />
           <folding>
             <element signature="e#38#68#0#PHP" expanded="true" />
             <element signature="e#337#456#0#PHP" expanded="false" />
@@ -708,9 +1319,43 @@
             <element signature="e#16468#16719#0#PHP" expanded="false" />
             <element signature="e#16725#17204#0#PHP" expanded="false" />
             <element signature="e#17209#17966#0#PHP" expanded="false" />
-            <element signature="e#17972#18387#0#PHP" expanded="false" />
-            <element signature="e#18392#18900#0#PHP" expanded="false" />
-            <element signature="e#18906#19123#0#PHP" expanded="false" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/public/assets/js/backend/pic.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="84">
+          <caret line="33" column="144" lean-forward="true" selection-start-line="33" selection-start-column="24" selection-end-line="33" selection-end-column="144" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/public/assets/js/backend/user/user.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="400">
+          <caret line="43" column="60" lean-forward="true" selection-start-line="43" selection-start-column="60" selection-end-line="43" selection-end-column="60" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/controller/user/User.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/api/controller/Pay.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="259">
+          <caret line="129" column="39" lean-forward="false" selection-start-line="129" selection-start-column="39" selection-end-line="129" selection-end-column="39" />
+          <folding>
+            <element signature="e#450#569#0#PHP" expanded="false" />
+            <element signature="e#575#888#0#PHP" expanded="false" />
+            <element signature="e#893#2938#0#PHP" expanded="false" />
+            <element signature="e#2961#3178#0#PHP" expanded="false" />
           </folding>
         </state>
       </provider>
diff --git a/application/api/controller/Ems.php b/application/api/controller/Ems.php
deleted file mode 100644
index 0046cdb..0000000
--- a/application/api/controller/Ems.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-namespace app\api\controller;
-
-use app\common\controller\Api;
-use app\common\library\Ems as Emslib;
-use app\common\model\User;
-
-/**
- * 邮箱验证码接口
- */
-class Ems extends Api
-{
-    protected $noNeedLogin = '*';
-    protected $noNeedRight = '*';
-
-    public function _initialize()
-    {
-        parent::_initialize();
-        \think\Hook::add('ems_send', function ($params) {
-            $obj = \app\common\library\Email::instance();
-            $result = $obj
-                ->to($params->email)
-                ->subject('验证码')
-                ->message("你的验证码是:" . $params->code)
-                ->send();
-            return $result;
-        });
-    }
-
-    /**
-     * 发送验证码
-     *
-     * @param string $email 邮箱
-     * @param string $event 事件名称
-     */
-    public function send()
-    {
-        $email = $this->request->request("email");
-        $event = $this->request->request("event");
-        $event = $event ? $event : 'register';
-
-        $last = Emslib::get($email, $event);
-        if ($last && time() - $last['createtime'] < 60) {
-            $this->error(__('发送频繁'));
-        }
-        if ($event) {
-            $userinfo = User::getByEmail($email);
-            if ($event == 'register' && $userinfo) {
-                //已被注册
-                $this->error(__('已被注册'));
-            } elseif (in_array($event, ['changeemail']) && $userinfo) {
-                //被占用
-                $this->error(__('已被占用'));
-            } elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
-                //未注册
-                $this->error(__('未注册'));
-            }
-        }
-        $ret = Emslib::send($email, null, $event);
-        if ($ret) {
-            $this->success(__('发送成功'));
-        } else {
-            $this->error(__('发送失败'));
-        }
-    }
-
-    /**
-     * 检测验证码
-     *
-     * @param string $email   邮箱
-     * @param string $event   事件名称
-     * @param string $captcha 验证码
-     */
-    public function check()
-    {
-        $email = $this->request->request("email");
-        $event = $this->request->request("event");
-        $event = $event ? $event : 'register';
-        $captcha = $this->request->request("captcha");
-
-        if ($event) {
-            $userinfo = User::getByEmail($email);
-            if ($event == 'register' && $userinfo) {
-                //已被注册
-                $this->error(__('已被注册'));
-            } elseif (in_array($event, ['changeemail']) && $userinfo) {
-                //被占用
-                $this->error(__('已被占用'));
-            } elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
-                //未注册
-                $this->error(__('未注册'));
-            }
-        }
-        $ret = Emslib::check($email, $captcha, $event);
-        if ($ret) {
-            $this->success(__('成功'));
-        } else {
-            $this->error(__('验证码不正确'));
-        }
-    }
-}
diff --git a/application/api/controller/Pay.php b/application/api/controller/Pay.php
index 755e4bb..6d8ee0a 100644
--- a/application/api/controller/Pay.php
+++ b/application/api/controller/Pay.php
@@ -2,8 +2,6 @@
 
 namespace app\api\controller;
 
-use app\admin\model\PayMember;
-use app\admin\model\ToBalance;
 use app\common\controller\Api;
 use EasyWeChat\Factory;
 use function GuzzleHttp\Promise\inspect;
@@ -19,7 +17,6 @@ use function EasyWeChat\Kernel\Support\generate_sign;
  */
 class Pay extends Api
 {
-    protected  $noNeedLogin = ['payMemberNotify','paySecurityNotify','payOrderNotify'];
     protected $noNeedRight = ['*'];
     protected $uid = '';//token存贮uid
     protected $order_status = [];//订单状态
@@ -30,226 +27,117 @@ class Pay extends Api
     }
 
     /**
-     * @ApiTitle    (充值/支付订单)
+     * @ApiTitle    (充值支付)
      * @ApiSummary  (充值支付)
      * @ApiMethod   (POST)
      * @ApiRoute    (/api/pay/pay)
      * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
      *
-     * @ApiParams   (name="openid", type="string", required=true, description="小程序openid")
-     * @ApiParams   (name="num", type="inter", required=false, description="支付订单号")
+     * @ApiParams   (name="order_id", type="inter", required=true, description="订单id")
      *
      */
     public function pay(){
+        $rule = config('verify.path');
         if($this->request->isPost()){
-            $openid = $this->request->post('openid');
-            $order_sn = $this->request->post('num');
-
+            $order_id = $this->request->post('order_id');
+            $openid = $this->getopenid();
             if(empty($openid)){
                 $this->error(['code'=>2,'msg'=>'openid不能为空']);
             }
-            if($order_sn){
-                //支付订单
-                $res = Db::name('order')->where(['num'=>$order_sn,'uid'=>$this->uid])->find();
-                if($res){
-                    if($res['status'] == 2){
-                        $this->error('该订单已支付过了');
-                    }else{
-                        //创建支付对象
-                        $config = config('verify.wx_pay');
-                        $app = Factory::payment($config);
-                        $result = $app->order->unify([
-                            'body' => '山东航拍',
-                            'out_trade_no' => $order_sn,//支付订单号
-                            'total_fee' => $money*100,//单位分
-                            'notify_url' => $notify_url, // 支付结果通知网址,如果不设置则会使用配置里的默认地址
-                            'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
-                            'openid' => $openid,
-                        ]);
-                        if($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS'){
-                            $params = [
-                                'appId'     => $config['app_id'],
-                                'timeStamp' => time(),
-                                'nonceStr'  => $result['nonce_str'], // 统一下单返回的随机字符串
-                                'package'   => 'prepay_id='.$result['prepay_id'], // 统一下单Id
-                                'signType'  => 'MD5', // 签名方法
-                            ];
-                            // 注意这里用的是商户平台的Key进行二次签名
-                            $params['paySign'] = generate_sign($params, $config['key']);
-                            $this->success('成功',$params);
-                        }
-                        $this->error($result['err_code_des']);
-                    }
+            $data = Db::name('toporder')->where('id',$order_id)->find();
+            if($data){
+                if($data['status'] == 2){
+                    $this->error('该订单已支付过了');
                 }else{
-                    $this->error('无效的订单');
+                    //创建支付对象
+                    $config = config('verify.wx_pay');
+                    $app = Factory::payment($config);
+                    $result = $app->order->unify([
+                        'body' => '山东航拍',
+                        'out_trade_no' => $data['num'],//支付订单号
+                        'total_fee' => $data['money']*100,//单位分
+                        'notify_url' => $rule.'api/pay/payOrderNotify', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
+                        'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
+                        'openid' => $openid,
+                    ]);
+                    if($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS'){
+                        $params = [
+                            'appId'     => $config['app_id'],
+                            'timeStamp' => time(),
+                            'nonceStr'  => $result['nonce_str'], // 统一下单返回的随机字符串
+                            'package'   => 'prepay_id='.$result['prepay_id'], // 统一下单Id
+                            'signType'  => 'MD5', // 签名方法
+                        ];
+                        // 注意这里用的是商户平台的Key进行二次签名
+                        $params['paySign'] = generate_sign($params, $config['key']);
+                        $this->success('成功',$params);
+                    }
+                    $this->error($result['err_code_des']);
                 }
+            }else{
+                $this->error('无效的订单');
             }
         }else{
             $this->error('请求方式错误');
         }
     }
 
-    //购买会员回调通知(无需调用)
-    public function payMemberNotify(){
-        $config = config('verify.wx_pay');
-        $app = Factory::payment($config);
-        Log::info('会员');
-        $response = $app->handlePaidNotify(function($message, $fail){
-            //return_code 表示通信状态
-            Log::info($message);
-            if ($message['return_code'] === 'SUCCESS') {
+    //获取用户openid
+    public function getopenid()
+    {
+        $user_id = $this->uid;
+        $openid = Db::name('user')
+            ->where('id',$user_id)
+            ->field('openid')
+            ->find();
 
-                if ($message['result_code'] === 'SUCCESS') {
-                    //支付成功
-                    //更新成为会员
-                    $userModel = new User();
-                    $userModel->where('openid',$message['openid'])->update(['member'=>1]);
-                    //增加记录
-                    $payMemberModel = new PayMember();
-                    $payMemberModel->create(['openid'=>$message['openid'],'pay_order'=>$message['out_trade_no']]);
-                }elseif($message['result_code'] === 'FAIL') {
-                    //支付失败
-                }
-            } else {
-                return $fail('通信失败,请稍后再通知我');
-            }
-            return true; // 返回处理完成
-        });
-        $response->send();
+        return $openid;
     }
 
-    //支付订单(无需调用)
+    //支付订单结果通知(无需调用)
     public function payOrderNotify(){
         $config = config('verify.wx_pay');
         $app = Factory::payment($config);
         $response = $app->handlePaidNotify(function($message, $fail){
+            $data = Db::name('toporder')
+                ->where('num',$message['out_trade_no'])
+                ->find();
             //return_code 表示通信状态
             if ($message['return_code'] === 'SUCCESS') {
 
                 if ($message['result_code'] === 'SUCCESS') {
                     //支付成功,更新订单状态
-                    $orderModel = new \app\admin\model\Order();
-                    $orderModel->where(['order_sn'=>$message['out_trade_no']])->update(['status'=>1]);
-
-                    //创建订房记录
-                    $this->auth->createHouseRecord($message['out_trade_no']);
-
-                }elseif($message['result_code'] === 'FAIL') {
+                    $toporder['status'] = 2;
+                    $toporder['paytime'] = time();
+                    $money = $data['money'];
+                    // 启动事务
+                    Db::startTrans();
+                    try{
+                        $res = Db::name('toporder')->where('num',$message['out_trade_no'])->update($toporder);
+                        $arr = Db::name('user')->where('id',$data['user_id'])->find();
+                        $list['money'] = $arr['money'] + $money;
+                        $info = Db::name('user')->where('id',$data['user_id'])->update(['money'=>$list['money']]);
+                        if($res && $info){
+                            true;
+                        }else{
+                            $this->error(['code'=>2,'msg'=>'充值失败']);
+                        }
+                        // 提交事务
+                        Db::commit();
+                    } catch (\Exception $e) {
+                        dump($e->getMessage());
+                        // 回滚事务
+                        Db::rollback();
+                    }
+                }else{
                     //支付失败
+                    Db::name('toporder')->where('num',$message['out_trade_no'])->update(['status'=>1]);
                 }
-            } else {
+            }else{
                 return $fail('通信失败,请稍后再通知我');
             }
             return true; // 返回处理完成
         });
         $response->send();
     }
-
-
-    /**
-     * @ApiTitle    (更新订单号(支付订单失败后调用))
-     * @ApiSummary  (更新订单号(支付订单失败后调用))
-     * @ApiMethod   (POST)
-     * @ApiRoute    (/api/pay/updateOrder)
-     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
-     *
-     * @ApiParams   (name="order_sn", type="inter", required=false, description="支付订单号")
-     *
-     * @ApiReturn({
-        "code": 1,
-        "msg": "成功",
-        "time": "1571812329",
-        "data": null
-    })
-     */
-    public function updateOrder(){
-        if($this->request->isPost()){
-            $order_sn = $this->request->post('order_sn');
-
-            $rule = config('verify.order_sn');
-            $validate = new Validate($rule['rule'],$rule['msg']);
-            if (!$validate->check(['order_sn'=>$order_sn])) {
-                $this->error($validate->getError());
-            }
-
-            $orderModel = new \app\admin\model\Order();
-            $pay_order = $this->auth->genPayOrderSn('pay');//支付订单号
-            $res = $orderModel->where(['order_sn'=>$order_sn,'uid'=>$this->uid])->update(['order_sn'=>$pay_order]);
-            if($res){
-                $this->success('成功');
-            }else{
-                $this->error('失败');
-            }
-        }else{
-            $this->error('请求方式错误');
-        }
-    }
-
-    /**
-     * @ApiTitle    (提现到微信零钱)
-     * @ApiSummary  (提现到微信零钱)
-     * @ApiMethod   (POST)
-     * @ApiRoute    (/api/pay/payBalance)
-     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
-     *
-     * @ApiParams   (name="openid", type="string", required=true, description="小程序openid")
-     * @ApiParams   (name="price", type="inter", required=true, description="提现金额")
-     */
-    public function payBalance(){
-        if($this->request->isPost()){
-            $price = $this->request->post('price');
-            $openid = $this->request->post('openid');
-
-            $rule = config('verify.to_balance');
-            $validate = new Validate($rule['rule'],$rule['msg']);
-            if (!$validate->check(['price'=>$price,'openid'=>$openid])) {
-                $this->error($validate->getError());
-            }
-
-            if($price < 0.3){
-                $this->error('提现金额不能低于0.3元');
-            }
-
-            //每天提现次数不超过三次
-            $count = Db::name('to_balance')->where('uid',$this->uid)->whereTime('createtime','today')->count();
-            if($count >= 3){
-                $this->error('每天提现次数不能超过3次');
-            }
-            //查询该用户钱包金额
-            $userModel = new User();
-            $user = $userModel->where(['id'=>$this->uid])->field('id,money,nickname')->find();
-            if($price > $user['money']){
-                $this->error('钱包金额不足');
-            }
-
-            //创建支付对象
-            $config = config('verify.wx_pay');
-            $app = Factory::payment($config);
-            $balance_order = $this->auth->genPayOrderSn('balance');//提现单号
-            $result = $app->transfer->toBalance([
-                'partner_trade_no' => $balance_order, // 商户订单号,需保持唯一性(只能是字母或者数字,不能包含有符号)
-                'openid' => $openid,
-                'check_name' => 'NO_CHECK', // NO_CHECK:不校验真实姓名, FORCE_CHECK:强校验真实姓名
-                're_user_name' => '', // 如果 check_name 设置为FORCE_CHECK,则必填用户真实姓名
-                'amount' => $price*100, // 企业付款金额,单位为分
-                'desc' => '提现到零钱', // 企业付款操作说明信息。必填
-            ]);
-            if($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS'){
-                //创建提现记录
-                $balanceRecordModel = new ToBalance();
-                $data['uid'] = $this->uid;
-                $data['openid'] = $openid;
-                $data['price'] = $price;
-                $data['to_order'] = $result['partner_trade_no'];
-                $balanceRecordModel->create($data);
-                //更新余额表
-                $userModel = new User();
-                $userModel->where(['id'=>$this->uid])->setDec('money',$price);
-                $this->success('成功');
-            }
-            $this->error($result['err_code_des']);
-        }else{
-            $this->error('请求方式错误');
-        }
-    }
 }
diff --git a/application/api/controller/User.php b/application/api/controller/User.php
index d4e055e..ca2ad6c 100644
--- a/application/api/controller/User.php
+++ b/application/api/controller/User.php
@@ -563,47 +563,4 @@ class User extends Api
 
     }
 
-    /**
-     * @ApiTitle    (充值支付)
-     * @ApiSummary  (充值支付)
-     * @ApiMethod   (POST)
-     * @ApiRoute    (/api/user/pay)
-     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
-     *
-     * @ApiParams   (name="order_id", type="inter", required=true, description="订单id")
-     *
-     * @ApiReturn({
-        "code": 1,
-        "msg": "成功",
-        "time": "1571492001",
-        })
-     */
-    public function pay()
-    {
-        $user_id = $this->uid;
-        $id = $this->request->post('order_id');
-        if(empty($id)){
-            $this->error(['code'=>2,'msg'=>'确实必要参数']);
-        }
-        $where['id'] = ['eq',$id];
-        $where['user_id'] = ['eq',$user_id];
-        $data = Db::name('toporder')->where($where)->find();
-        if(empty($data)){
-            $this->error(['code'=>41001,'msg'=>'数据错误']);
-        }
-        $openid = $this->getopenid();
-        $this->success('SUCCESS');
-    }
-
-    public function getopenid()
-    {
-        $user_id = $this->uid;
-        $openid = Db::name('user')
-            ->where('id',$user_id)
-            ->field('openid')
-            ->find();
-
-        return $openid;
-    }
-
 }
diff --git a/composer.json b/composer.json
index 39a4fab..b0085bc 100644
--- a/composer.json
+++ b/composer.json
@@ -17,14 +17,14 @@
     "require": {
         "php": ">=5.6.0",
         "topthink/framework": "~5.0.24",
-        "overtrue/wechat": "~3.1",
         "endroid/qr-code": "^1.9",
         "topthink/think-captcha": "^1.0",
         "mtdowling/cron-expression": "^1.2",
         "phpmailer/phpmailer": "^5.2",
         "karsonzhang/fastadmin-addons": "~1.1.9",
         "overtrue/pinyin": "~3.0",
-        "phpoffice/phpspreadsheet": "^1.2"
+        "phpoffice/phpspreadsheet": "^1.2",
+        "overtrue/wechat": "~4.0"
     },
     "config": {
         "preferred-install": "dist"
diff --git a/public/api.html b/public/api.html
index 00000da..9c0fe42 100644
--- a/public/api.html
+++ b/public/api.html
@@ -144,39 +144,30 @@
                                                 <a href="javascript:;" data-id="0" class="list-group-item">加载初始化</a>
                                                 <a href="javascript:;" data-id="1" class="list-group-item">上传文件</a>
                                             </div>
-                                        <a href="#邮箱验证码接口" class="list-group-item" data-toggle="collapse" data-parent="#sidebar">邮箱验证码接口  <i class="fa fa-caret-down"></i></a>
-                    <div class="child collapse" id="邮箱验证码接口">
-                                                <a href="javascript:;" data-id="2" class="list-group-item">发送验证码</a>
-                                                <a href="javascript:;" data-id="3" class="list-group-item">检测验证码</a>
-                                            </div>
                                         <a href="#支付接口" class="list-group-item" data-toggle="collapse" data-parent="#sidebar">支付接口  <i class="fa fa-caret-down"></i></a>
                     <div class="child collapse" id="支付接口">
-                                                <a href="javascript:;" data-id="4" class="list-group-item">充值/支付订单</a>
-                                                <a href="javascript:;" data-id="5" class="list-group-item"></a>
-                                                <a href="javascript:;" data-id="6" class="list-group-item"></a>
-                                                <a href="javascript:;" data-id="7" class="list-group-item">更新订单号(支付订单失败后调用)</a>
-                                                <a href="javascript:;" data-id="8" class="list-group-item">提现到微信零钱</a>
+                                                <a href="javascript:;" data-id="2" class="list-group-item">充值支付</a>
+                                                <a href="javascript:;" data-id="3" class="list-group-item"></a>
+                                                <a href="javascript:;" data-id="4" class="list-group-item"></a>
                                             </div>
                                         <a href="#Token接口" class="list-group-item" data-toggle="collapse" data-parent="#sidebar">Token接口  <i class="fa fa-caret-down"></i></a>
                     <div class="child collapse" id="Token接口">
-                                                <a href="javascript:;" data-id="9" class="list-group-item">检测Token是否过期</a>
-                                                <a href="javascript:;" data-id="10" class="list-group-item">刷新Token</a>
+                                                <a href="javascript:;" data-id="5" class="list-group-item">检测Token是否过期</a>
+                                                <a href="javascript:;" data-id="6" class="list-group-item">刷新Token</a>
                                             </div>
                                         <a href="#个人中心" class="list-group-item" data-toggle="collapse" data-parent="#sidebar">个人中心  <i class="fa fa-caret-down"></i></a>
                     <div class="child collapse" id="个人中心">
-                                                <a href="javascript:;" data-id="11" class="list-group-item">小程序登录</a>
-                                                <a href="javascript:;" data-id="12" class="list-group-item">首页视频、图片、精美大片入口</a>
-                                                <a href="javascript:;" data-id="13" class="list-group-item">地区分类</a>
-                                                <a href="javascript:;" data-id="14" class="list-group-item">搜索页</a>
-                                                <a href="javascript:;" data-id="15" class="list-group-item">图片列表</a>
-                                                <a href="javascript:;" data-id="16" class="list-group-item">视频列表</a>
-                                                <a href="javascript:;" data-id="17" class="list-group-item">图片详情</a>
-                                                <a href="javascript:;" data-id="18" class="list-group-item">视频详情</a>
-                                                <a href="javascript:;" data-id="19" class="list-group-item">历史记录</a>
-                                                <a href="javascript:;" data-id="20" class="list-group-item">我的</a>
-                                                <a href="javascript:;" data-id="21" class="list-group-item">创建充值订单</a>
-                                                <a href="javascript:;" data-id="22" class="list-group-item">充值支付</a>
-                                                <a href="javascript:;" data-id="23" class="list-group-item"></a>
+                                                <a href="javascript:;" data-id="7" class="list-group-item">小程序登录</a>
+                                                <a href="javascript:;" data-id="8" class="list-group-item">首页视频、图片、精美大片入口</a>
+                                                <a href="javascript:;" data-id="9" class="list-group-item">地区分类</a>
+                                                <a href="javascript:;" data-id="10" class="list-group-item">搜索页</a>
+                                                <a href="javascript:;" data-id="11" class="list-group-item">图片列表</a>
+                                                <a href="javascript:;" data-id="12" class="list-group-item">视频列表</a>
+                                                <a href="javascript:;" data-id="13" class="list-group-item">图片详情</a>
+                                                <a href="javascript:;" data-id="14" class="list-group-item">视频详情</a>
+                                                <a href="javascript:;" data-id="15" class="list-group-item">历史记录</a>
+                                                <a href="javascript:;" data-id="16" class="list-group-item">我的</a>
+                                                <a href="javascript:;" data-id="17" class="list-group-item">创建充值订单</a>
                                             </div>
                                     </div>
             </div>
@@ -423,13 +414,13 @@
                         </div>
                     </div>
                 </div>
-                                <h2>邮箱验证码接口</h2>
+                                <h2>支付接口</h2>
                 <hr>
                                 <div class="panel panel-default">
                     <div class="panel-heading" id="heading-2">
                         <h4 class="panel-title">
-                            <span class="label label-success">GET</span>
-                            <a data-toggle="collapse" data-parent="#accordion2" href="#collapseOne2"> 发送验证码 <span class="text-muted">/api/ems/send</span></a>
+                            <span class="label label-primary">POST</span>
+                            <a data-toggle="collapse" data-parent="#accordion2" href="#collapseOne2"> 充值支付 <span class="text-muted">/api/pay/pay</span></a>
                         </h4>
                     </div>
                     <div id="collapseOne2" class="panel-collapse collapse">
@@ -447,11 +438,28 @@
 
                                 <div class="tab-pane active" id="info2">
                                     <div class="well">
-                                        发送验证码                                    </div>
+                                        充值支付                                    </div>
                                     <div class="panel panel-default">
                                         <div class="panel-heading"><strong>Headers</strong></div>
                                         <div class="panel-body">
-                                                                                        无
+                                                                                        <table class="table table-hover">
+                                                <thead>
+                                                    <tr>
+                                                        <th>名称</th>
+                                                        <th>类型</th>
+                                                        <th>必选</th>
+                                                        <th>描述</th>
+                                                    </tr>
+                                                </thead>
+                                                <tbody>
+                                                                                                        <tr>
+                                                        <td>token</td>
+                                                        <td>string</td>
+                                                        <td>是</td>
+                                                        <td>请求的Token</td>
+                                                    </tr>
+                                                                                                    </tbody>
+                                            </table>
                                                                                     </div>
                                     </div>
                                     <div class="panel panel-default">
@@ -468,16 +476,10 @@
                                                 </thead>
                                                 <tbody>
                                                                                                         <tr>
-                                                        <td>email</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>邮箱</td>
-                                                    </tr>
-                                                                                                        <tr>
-                                                        <td>event</td>
-                                                        <td>string</td>
+                                                        <td>order_id</td>
+                                                        <td>inter</td>
                                                         <td>是</td>
-                                                        <td>事件名称</td>
+                                                        <td>订单id</td>
                                                     </tr>
                                                                                                     </tbody>
                                             </table>
@@ -494,16 +496,23 @@
                                     <div class="row">
                                         <div class="col-md-12">
                                                                                         <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>参数</strong></div>
+                                                <div class="panel-heading"><strong>Headers</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/ems/send" method="get" name="form2" id="form2">
+                                                    <div class="headers">
                                                                                                                 <div class="form-group">
-                                                            <label class="control-label" for="email">email</label>
-                                                            <input type="string" class="form-control input-sm" id="email" required placeholder="邮箱" name="email">
+                                                            <label class="control-label" for="token">token</label>
+                                                            <input type="string" class="form-control input-sm" id="token" required placeholder="请求的Token - Ex: " name="token">
                                                         </div>
+                                                                                                            </div>
+                                                </div>
+                                            </div>
+                                                                                        <div class="panel panel-default">
+                                                <div class="panel-heading"><strong>参数</strong></div>
+                                                <div class="panel-body">
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/pay/pay" method="POST" name="form2" id="form2">
                                                                                                                 <div class="form-group">
-                                                            <label class="control-label" for="event">event</label>
-                                                            <input type="string" class="form-control input-sm" id="event" required placeholder="事件名称" name="event">
+                                                            <label class="control-label" for="order_id">order_id</label>
+                                                            <input type="inter" class="form-control input-sm" id="order_id" required placeholder="订单id" name="order_id">
                                                         </div>
                                                                                                                 <div class="form-group">
                                                             <button type="submit" class="btn btn-success send" rel="2">提交</button>
@@ -549,7 +558,7 @@
                     <div class="panel-heading" id="heading-3">
                         <h4 class="panel-title">
                             <span class="label label-success">GET</span>
-                            <a data-toggle="collapse" data-parent="#accordion3" href="#collapseOne3"> 检测验证码 <span class="text-muted">/api/ems/check</span></a>
+                            <a data-toggle="collapse" data-parent="#accordion3" href="#collapseOne3">  <span class="text-muted">/api/pay/getopenid</span></a>
                         </h4>
                     </div>
                     <div id="collapseOne3" class="panel-collapse collapse">
@@ -567,7 +576,7 @@
 
                                 <div class="tab-pane active" id="info3">
                                     <div class="well">
-                                        检测验证码                                    </div>
+                                                                            </div>
                                     <div class="panel panel-default">
                                         <div class="panel-heading"><strong>Headers</strong></div>
                                         <div class="panel-body">
@@ -577,36 +586,7 @@
                                     <div class="panel panel-default">
                                         <div class="panel-heading"><strong>参数</strong></div>
                                         <div class="panel-body">
-                                                                                        <table class="table table-hover">
-                                                <thead>
-                                                    <tr>
-                                                        <th>名称</th>
-                                                        <th>类型</th>
-                                                        <th>必选</th>
-                                                        <th>描述</th>
-                                                    </tr>
-                                                </thead>
-                                                <tbody>
-                                                                                                        <tr>
-                                                        <td>email</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>邮箱</td>
-                                                    </tr>
-                                                                                                        <tr>
-                                                        <td>event</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>事件名称</td>
-                                                    </tr>
-                                                                                                        <tr>
-                                                        <td>captcha</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>验证码</td>
-                                                    </tr>
-                                                                                                    </tbody>
-                                            </table>
+                                                                                        无
                                                                                     </div>
                                     </div>
                                     <div class="panel panel-default">
@@ -622,18 +602,9 @@
                                                                                         <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/ems/check" method="get" name="form3" id="form3">
-                                                                                                                <div class="form-group">
-                                                            <label class="control-label" for="email">email</label>
-                                                            <input type="string" class="form-control input-sm" id="email" required placeholder="邮箱" name="email">
-                                                        </div>
-                                                                                                                <div class="form-group">
-                                                            <label class="control-label" for="event">event</label>
-                                                            <input type="string" class="form-control input-sm" id="event" required placeholder="事件名称" name="event">
-                                                        </div>
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/pay/getopenid" method="get" name="form3" id="form3">
                                                                                                                 <div class="form-group">
-                                                            <label class="control-label" for="captcha">captcha</label>
-                                                            <input type="string" class="form-control input-sm" id="captcha" required placeholder="验证码" name="captcha">
+                                                            无
                                                         </div>
                                                                                                                 <div class="form-group">
                                                             <button type="submit" class="btn btn-success send" rel="3">提交</button>
@@ -675,13 +646,11 @@
                         </div>
                     </div>
                 </div>
-                                <h2>支付接口</h2>
-                <hr>
                                 <div class="panel panel-default">
                     <div class="panel-heading" id="heading-4">
                         <h4 class="panel-title">
-                            <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion4" href="#collapseOne4"> 充值/支付订单 <span class="text-muted">/api/pay/pay</span></a>
+                            <span class="label label-success">GET</span>
+                            <a data-toggle="collapse" data-parent="#accordion4" href="#collapseOne4">  <span class="text-muted">/api/pay/payOrderNotify</span></a>
                         </h4>
                     </div>
                     <div id="collapseOne4" class="panel-collapse collapse">
@@ -699,57 +668,17 @@
 
                                 <div class="tab-pane active" id="info4">
                                     <div class="well">
-                                        充值支付                                    </div>
+                                                                            </div>
                                     <div class="panel panel-default">
                                         <div class="panel-heading"><strong>Headers</strong></div>
                                         <div class="panel-body">
-                                                                                        <table class="table table-hover">
-                                                <thead>
-                                                    <tr>
-                                                        <th>名称</th>
-                                                        <th>类型</th>
-                                                        <th>必选</th>
-                                                        <th>描述</th>
-                                                    </tr>
-                                                </thead>
-                                                <tbody>
-                                                                                                        <tr>
-                                                        <td>token</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>请求的Token</td>
-                                                    </tr>
-                                                                                                    </tbody>
-                                            </table>
+                                                                                        无
                                                                                     </div>
                                     </div>
                                     <div class="panel panel-default">
                                         <div class="panel-heading"><strong>参数</strong></div>
                                         <div class="panel-body">
-                                                                                        <table class="table table-hover">
-                                                <thead>
-                                                    <tr>
-                                                        <th>名称</th>
-                                                        <th>类型</th>
-                                                        <th>必选</th>
-                                                        <th>描述</th>
-                                                    </tr>
-                                                </thead>
-                                                <tbody>
-                                                                                                        <tr>
-                                                        <td>openid</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>小程序openid</td>
-                                                    </tr>
-                                                                                                        <tr>
-                                                        <td>num</td>
-                                                        <td>inter</td>
-                                                        <td>否</td>
-                                                        <td>支付订单号</td>
-                                                    </tr>
-                                                                                                    </tbody>
-                                            </table>
+                                                                                        无
                                                                                     </div>
                                     </div>
                                     <div class="panel panel-default">
@@ -763,27 +692,11 @@
                                     <div class="row">
                                         <div class="col-md-12">
                                                                                         <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>Headers</strong></div>
-                                                <div class="panel-body">
-                                                    <div class="headers">
-                                                                                                                <div class="form-group">
-                                                            <label class="control-label" for="token">token</label>
-                                                            <input type="string" class="form-control input-sm" id="token" required placeholder="请求的Token - Ex: " name="token">
-                                                        </div>
-                                                                                                            </div>
-                                                </div>
-                                            </div>
-                                                                                        <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/pay/pay" method="POST" name="form4" id="form4">
-                                                                                                                <div class="form-group">
-                                                            <label class="control-label" for="openid">openid</label>
-                                                            <input type="string" class="form-control input-sm" id="openid" required placeholder="小程序openid" name="openid">
-                                                        </div>
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/pay/payOrderNotify" method="get" name="form4" id="form4">
                                                                                                                 <div class="form-group">
-                                                            <label class="control-label" for="num">num</label>
-                                                            <input type="inter" class="form-control input-sm" id="num"  placeholder="支付订单号" name="num">
+                                                            无
                                                         </div>
                                                                                                                 <div class="form-group">
                                                             <button type="submit" class="btn btn-success send" rel="4">提交</button>
@@ -825,11 +738,13 @@
                         </div>
                     </div>
                 </div>
+                                <h2>Token接口</h2>
+                <hr>
                                 <div class="panel panel-default">
                     <div class="panel-heading" id="heading-5">
                         <h4 class="panel-title">
                             <span class="label label-success">GET</span>
-                            <a data-toggle="collapse" data-parent="#accordion5" href="#collapseOne5">  <span class="text-muted">/api/pay/payMemberNotify</span></a>
+                            <a data-toggle="collapse" data-parent="#accordion5" href="#collapseOne5"> 检测Token是否过期 <span class="text-muted">/api/token/check</span></a>
                         </h4>
                     </div>
                     <div id="collapseOne5" class="panel-collapse collapse">
@@ -847,7 +762,7 @@
 
                                 <div class="tab-pane active" id="info5">
                                     <div class="well">
-                                                                            </div>
+                                        检测Token是否过期                                    </div>
                                     <div class="panel panel-default">
                                         <div class="panel-heading"><strong>Headers</strong></div>
                                         <div class="panel-body">
@@ -873,7 +788,7 @@
                                                                                         <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/pay/payMemberNotify" method="get" name="form5" id="form5">
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/token/check" method="get" name="form5" id="form5">
                                                                                                                 <div class="form-group">
                                                             无
                                                         </div>
@@ -921,7 +836,7 @@
                     <div class="panel-heading" id="heading-6">
                         <h4 class="panel-title">
                             <span class="label label-success">GET</span>
-                            <a data-toggle="collapse" data-parent="#accordion6" href="#collapseOne6">  <span class="text-muted">/api/pay/payOrderNotify</span></a>
+                            <a data-toggle="collapse" data-parent="#accordion6" href="#collapseOne6"> 刷新Token <span class="text-muted">/api/token/refresh</span></a>
                         </h4>
                     </div>
                     <div id="collapseOne6" class="panel-collapse collapse">
@@ -939,7 +854,7 @@
 
                                 <div class="tab-pane active" id="info6">
                                     <div class="well">
-                                                                            </div>
+                                        刷新Token                                    </div>
                                     <div class="panel panel-default">
                                         <div class="panel-heading"><strong>Headers</strong></div>
                                         <div class="panel-body">
@@ -965,7 +880,7 @@
                                                                                         <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/pay/payOrderNotify" method="get" name="form6" id="form6">
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/token/refresh" method="get" name="form6" id="form6">
                                                                                                                 <div class="form-group">
                                                             无
                                                         </div>
@@ -1009,11 +924,13 @@
                         </div>
                     </div>
                 </div>
+                                <h2>个人中心</h2>
+                <hr>
                                 <div class="panel panel-default">
                     <div class="panel-heading" id="heading-7">
                         <h4 class="panel-title">
                             <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion7" href="#collapseOne7"> 更新订单号(支付订单失败后调用) <span class="text-muted">/api/pay/updateOrder</span></a>
+                            <a data-toggle="collapse" data-parent="#accordion7" href="#collapseOne7"> 小程序登录 <span class="text-muted">/api/user/login</span></a>
                         </h4>
                     </div>
                     <div id="collapseOne7" class="panel-collapse collapse">
@@ -1031,28 +948,11 @@
 
                                 <div class="tab-pane active" id="info7">
                                     <div class="well">
-                                        更新订单号(支付订单失败后调用)                                    </div>
+                                        小程序登录                                    </div>
                                     <div class="panel panel-default">
                                         <div class="panel-heading"><strong>Headers</strong></div>
                                         <div class="panel-body">
-                                                                                        <table class="table table-hover">
-                                                <thead>
-                                                    <tr>
-                                                        <th>名称</th>
-                                                        <th>类型</th>
-                                                        <th>必选</th>
-                                                        <th>描述</th>
-                                                    </tr>
-                                                </thead>
-                                                <tbody>
-                                                                                                        <tr>
-                                                        <td>token</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>请求的Token</td>
-                                                    </tr>
-                                                                                                    </tbody>
-                                            </table>
+                                                                                        无
                                                                                     </div>
                                     </div>
                                     <div class="panel panel-default">
@@ -1069,10 +969,22 @@
                                                 </thead>
                                                 <tbody>
                                                                                                         <tr>
-                                                        <td>order_sn</td>
-                                                        <td>inter</td>
-                                                        <td>否</td>
-                                                        <td>支付订单号</td>
+                                                        <td>code</td>
+                                                        <td>string</td>
+                                                        <td>是</td>
+                                                        <td>小程序code</td>
+                                                    </tr>
+                                                                                                        <tr>
+                                                        <td>nickname</td>
+                                                        <td>string</td>
+                                                        <td>是</td>
+                                                        <td>小程序昵称</td>
+                                                    </tr>
+                                                                                                        <tr>
+                                                        <td>avatar</td>
+                                                        <td>string</td>
+                                                        <td>是</td>
+                                                        <td>小程序头像</td>
                                                     </tr>
                                                                                                     </tbody>
                                             </table>
@@ -1089,23 +1001,20 @@
                                     <div class="row">
                                         <div class="col-md-12">
                                                                                         <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>Headers</strong></div>
+                                                <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <div class="headers">
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/login" method="POST" name="form7" id="form7">
                                                                                                                 <div class="form-group">
-                                                            <label class="control-label" for="token">token</label>
-                                                            <input type="string" class="form-control input-sm" id="token" required placeholder="请求的Token - Ex: " name="token">
+                                                            <label class="control-label" for="code">code</label>
+                                                            <input type="string" class="form-control input-sm" id="code" required placeholder="小程序code" name="code">
+                                                        </div>
+                                                                                                                <div class="form-group">
+                                                            <label class="control-label" for="nickname">nickname</label>
+                                                            <input type="string" class="form-control input-sm" id="nickname" required placeholder="小程序昵称" name="nickname">
                                                         </div>
-                                                                                                            </div>
-                                                </div>
-                                            </div>
-                                                                                        <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>参数</strong></div>
-                                                <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/pay/updateOrder" method="POST" name="form7" id="form7">
                                                                                                                 <div class="form-group">
-                                                            <label class="control-label" for="order_sn">order_sn</label>
-                                                            <input type="inter" class="form-control input-sm" id="order_sn"  placeholder="支付订单号" name="order_sn">
+                                                            <label class="control-label" for="avatar">avatar</label>
+                                                            <input type="string" class="form-control input-sm" id="avatar" required placeholder="小程序头像" name="avatar">
                                                         </div>
                                                                                                                 <div class="form-group">
                                                             <button type="submit" class="btn btn-success send" rel="7">提交</button>
@@ -1139,10 +1048,16 @@
                                     <div class="row">
                                         <div class="col-md-12">
                                             <pre id="sample_response7">{
-        "code": 1,
-        "msg": "成功",
-        "time": "1571812329",
-        "data": null
+    "code": 1,
+    "msg": "登录成功",
+    "time": "1553839125",
+    "data": {
+    "token": "677afb39-1a4f-4492-84d3-0bcf32016b8a",//token
+    "user_id": 27,//用户id
+    "createtime": 1553839125,//登录时间
+    "expiretime": 1556431125,//token失效时间
+    "expires_in": 2592000//token失效剩余时间(单位s)
+    "openid": 1485212522522//openid
     }</pre>
                                         </div>
                                     </div>
@@ -1156,7 +1071,7 @@
                     <div class="panel-heading" id="heading-8">
                         <h4 class="panel-title">
                             <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion8" href="#collapseOne8"> 提现到微信零钱 <span class="text-muted">/api/pay/payBalance</span></a>
+                            <a data-toggle="collapse" data-parent="#accordion8" href="#collapseOne8"> 首页视频、图片、精美大片入口 <span class="text-muted">/api/user/index</span></a>
                         </h4>
                     </div>
                     <div id="collapseOne8" class="panel-collapse collapse">
@@ -1174,7 +1089,7 @@
 
                                 <div class="tab-pane active" id="info8">
                                     <div class="well">
-                                        提现到微信零钱                                    </div>
+                                        首页视频、图片、精美大片入口                                    </div>
                                     <div class="panel panel-default">
                                         <div class="panel-heading"><strong>Headers</strong></div>
                                         <div class="panel-body">
@@ -1201,30 +1116,7 @@
                                     <div class="panel panel-default">
                                         <div class="panel-heading"><strong>参数</strong></div>
                                         <div class="panel-body">
-                                                                                        <table class="table table-hover">
-                                                <thead>
-                                                    <tr>
-                                                        <th>名称</th>
-                                                        <th>类型</th>
-                                                        <th>必选</th>
-                                                        <th>描述</th>
-                                                    </tr>
-                                                </thead>
-                                                <tbody>
-                                                                                                        <tr>
-                                                        <td>openid</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>小程序openid</td>
-                                                    </tr>
-                                                                                                        <tr>
-                                                        <td>price</td>
-                                                        <td>inter</td>
-                                                        <td>是</td>
-                                                        <td>提现金额</td>
-                                                    </tr>
-                                                                                                    </tbody>
-                                            </table>
+                                                                                        无
                                                                                     </div>
                                     </div>
                                     <div class="panel panel-default">
@@ -1251,14 +1143,9 @@
                                                                                         <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/pay/payBalance" method="POST" name="form8" id="form8">
-                                                                                                                <div class="form-group">
-                                                            <label class="control-label" for="openid">openid</label>
-                                                            <input type="string" class="form-control input-sm" id="openid" required placeholder="小程序openid" name="openid">
-                                                        </div>
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/index" method="POST" name="form8" id="form8">
                                                                                                                 <div class="form-group">
-                                                            <label class="control-label" for="price">price</label>
-                                                            <input type="inter" class="form-control input-sm" id="price" required placeholder="提现金额" name="price">
+                                                            无
                                                         </div>
                                                                                                                 <div class="form-group">
                                                             <button type="submit" class="btn btn-success send" rel="8">提交</button>
@@ -1291,7 +1178,16 @@
                                 <div class="tab-pane" id="sample8">
                                     <div class="row">
                                         <div class="col-md-12">
-                                            <pre id="sample_response8">无</pre>
+                                            <pre id="sample_response8">{
+    'code':'1',
+    'msg':'返回成功',
+    "time": "1571492001",
+        "data": {
+        "video_thumbnail": http://mapwww.baidu.com 视频封面图地址
+        "pic_thumbnail": http://mapwww.baidu.com 图片地址
+        "wonderful_thumbnail": http://mapwww.baidu.com 精美大片地址
+        }
+    }</pre>
                                         </div>
                                     </div>
                                 </div><!-- #sample -->
@@ -1300,13 +1196,11 @@
                         </div>
                     </div>
                 </div>
-                                <h2>Token接口</h2>
-                <hr>
                                 <div class="panel panel-default">
                     <div class="panel-heading" id="heading-9">
                         <h4 class="panel-title">
-                            <span class="label label-success">GET</span>
-                            <a data-toggle="collapse" data-parent="#accordion9" href="#collapseOne9"> 检测Token是否过期 <span class="text-muted">/api/token/check</span></a>
+                            <span class="label label-primary">POST</span>
+                            <a data-toggle="collapse" data-parent="#accordion9" href="#collapseOne9"> 地区分类 <span class="text-muted">/api/user/type</span></a>
                         </h4>
                     </div>
                     <div id="collapseOne9" class="panel-collapse collapse">
@@ -1324,463 +1218,7 @@
 
                                 <div class="tab-pane active" id="info9">
                                     <div class="well">
-                                        检测Token是否过期                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>Headers</strong></div>
-                                        <div class="panel-body">
-                                                                                        无
-                                                                                    </div>
-                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>参数</strong></div>
-                                        <div class="panel-body">
-                                                                                        无
-                                                                                    </div>
-                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>正文</strong></div>
-                                        <div class="panel-body">
-                                            无                                        </div>
-                                    </div>
-                                </div><!-- #info -->
-
-                                <div class="tab-pane" id="sandbox9">
-                                    <div class="row">
-                                        <div class="col-md-12">
-                                                                                        <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>参数</strong></div>
-                                                <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/token/check" method="get" name="form9" id="form9">
-                                                                                                                <div class="form-group">
-                                                            无
-                                                        </div>
-                                                                                                                <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="9">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="9">重置</button>
-                                                        </div>
-                                                    </form>
-                                                </div>
-                                            </div>
-                                            <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>响应输出</strong></div>
-                                                <div class="panel-body">
-                                                    <div class="row">
-                                                        <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers9"></pre>
-                                                            <pre id="response9"></pre>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                            <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>返回参数</strong></div>
-                                                <div class="panel-body">
-                                                                                                        无
-                                                                                                    </div>
-                                            </div>
-                                        </div>
-                                    </div>
-                                </div><!-- #sandbox -->
-
-                                <div class="tab-pane" id="sample9">
-                                    <div class="row">
-                                        <div class="col-md-12">
-                                            <pre id="sample_response9">无</pre>
-                                        </div>
-                                    </div>
-                                </div><!-- #sample -->
-
-                            </div><!-- .tab-content -->
-                        </div>
-                    </div>
-                </div>
-                                <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-10">
-                        <h4 class="panel-title">
-                            <span class="label label-success">GET</span>
-                            <a data-toggle="collapse" data-parent="#accordion10" href="#collapseOne10"> 刷新Token <span class="text-muted">/api/token/refresh</span></a>
-                        </h4>
-                    </div>
-                    <div id="collapseOne10" class="panel-collapse collapse">
-                        <div class="panel-body">
-
-                            <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab10">
-                                <li class="active"><a href="#info10" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox10" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample10" data-toggle="tab">返回示例</a></li>
-                            </ul>
-
-                            <!-- Tab panes -->
-                            <div class="tab-content">
-
-                                <div class="tab-pane active" id="info10">
-                                    <div class="well">
-                                        刷新Token                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>Headers</strong></div>
-                                        <div class="panel-body">
-                                                                                        无
-                                                                                    </div>
-                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>参数</strong></div>
-                                        <div class="panel-body">
-                                                                                        无
-                                                                                    </div>
-                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>正文</strong></div>
-                                        <div class="panel-body">
-                                            无                                        </div>
-                                    </div>
-                                </div><!-- #info -->
-
-                                <div class="tab-pane" id="sandbox10">
-                                    <div class="row">
-                                        <div class="col-md-12">
-                                                                                        <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>参数</strong></div>
-                                                <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/token/refresh" method="get" name="form10" id="form10">
-                                                                                                                <div class="form-group">
-                                                            无
-                                                        </div>
-                                                                                                                <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="10">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="10">重置</button>
-                                                        </div>
-                                                    </form>
-                                                </div>
-                                            </div>
-                                            <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>响应输出</strong></div>
-                                                <div class="panel-body">
-                                                    <div class="row">
-                                                        <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers10"></pre>
-                                                            <pre id="response10"></pre>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                            <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>返回参数</strong></div>
-                                                <div class="panel-body">
-                                                                                                        无
-                                                                                                    </div>
-                                            </div>
-                                        </div>
-                                    </div>
-                                </div><!-- #sandbox -->
-
-                                <div class="tab-pane" id="sample10">
-                                    <div class="row">
-                                        <div class="col-md-12">
-                                            <pre id="sample_response10">无</pre>
-                                        </div>
-                                    </div>
-                                </div><!-- #sample -->
-
-                            </div><!-- .tab-content -->
-                        </div>
-                    </div>
-                </div>
-                                <h2>个人中心</h2>
-                <hr>
-                                <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-11">
-                        <h4 class="panel-title">
-                            <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion11" href="#collapseOne11"> 小程序登录 <span class="text-muted">/api/user/login</span></a>
-                        </h4>
-                    </div>
-                    <div id="collapseOne11" class="panel-collapse collapse">
-                        <div class="panel-body">
-
-                            <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab11">
-                                <li class="active"><a href="#info11" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox11" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample11" data-toggle="tab">返回示例</a></li>
-                            </ul>
-
-                            <!-- Tab panes -->
-                            <div class="tab-content">
-
-                                <div class="tab-pane active" id="info11">
-                                    <div class="well">
-                                        小程序登录                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>Headers</strong></div>
-                                        <div class="panel-body">
-                                                                                        无
-                                                                                    </div>
-                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>参数</strong></div>
-                                        <div class="panel-body">
-                                                                                        <table class="table table-hover">
-                                                <thead>
-                                                    <tr>
-                                                        <th>名称</th>
-                                                        <th>类型</th>
-                                                        <th>必选</th>
-                                                        <th>描述</th>
-                                                    </tr>
-                                                </thead>
-                                                <tbody>
-                                                                                                        <tr>
-                                                        <td>code</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>小程序code</td>
-                                                    </tr>
-                                                                                                        <tr>
-                                                        <td>nickname</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>小程序昵称</td>
-                                                    </tr>
-                                                                                                        <tr>
-                                                        <td>avatar</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>小程序头像</td>
-                                                    </tr>
-                                                                                                    </tbody>
-                                            </table>
-                                                                                    </div>
-                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>正文</strong></div>
-                                        <div class="panel-body">
-                                            无                                        </div>
-                                    </div>
-                                </div><!-- #info -->
-
-                                <div class="tab-pane" id="sandbox11">
-                                    <div class="row">
-                                        <div class="col-md-12">
-                                                                                        <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>参数</strong></div>
-                                                <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/login" method="POST" name="form11" id="form11">
-                                                                                                                <div class="form-group">
-                                                            <label class="control-label" for="code">code</label>
-                                                            <input type="string" class="form-control input-sm" id="code" required placeholder="小程序code" name="code">
-                                                        </div>
-                                                                                                                <div class="form-group">
-                                                            <label class="control-label" for="nickname">nickname</label>
-                                                            <input type="string" class="form-control input-sm" id="nickname" required placeholder="小程序昵称" name="nickname">
-                                                        </div>
-                                                                                                                <div class="form-group">
-                                                            <label class="control-label" for="avatar">avatar</label>
-                                                            <input type="string" class="form-control input-sm" id="avatar" required placeholder="小程序头像" name="avatar">
-                                                        </div>
-                                                                                                                <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="11">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="11">重置</button>
-                                                        </div>
-                                                    </form>
-                                                </div>
-                                            </div>
-                                            <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>响应输出</strong></div>
-                                                <div class="panel-body">
-                                                    <div class="row">
-                                                        <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers11"></pre>
-                                                            <pre id="response11"></pre>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                            <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>返回参数</strong></div>
-                                                <div class="panel-body">
-                                                                                                        无
-                                                                                                    </div>
-                                            </div>
-                                        </div>
-                                    </div>
-                                </div><!-- #sandbox -->
-
-                                <div class="tab-pane" id="sample11">
-                                    <div class="row">
-                                        <div class="col-md-12">
-                                            <pre id="sample_response11">{
-    "code": 1,
-    "msg": "登录成功",
-    "time": "1553839125",
-    "data": {
-    "token": "677afb39-1a4f-4492-84d3-0bcf32016b8a",//token
-    "user_id": 27,//用户id
-    "createtime": 1553839125,//登录时间
-    "expiretime": 1556431125,//token失效时间
-    "expires_in": 2592000//token失效剩余时间(单位s)
-    "openid": 1485212522522//openid
-    }</pre>
-                                        </div>
-                                    </div>
-                                </div><!-- #sample -->
-
-                            </div><!-- .tab-content -->
-                        </div>
-                    </div>
-                </div>
-                                <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-12">
-                        <h4 class="panel-title">
-                            <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion12" href="#collapseOne12"> 首页视频、图片、精美大片入口 <span class="text-muted">/api/user/index</span></a>
-                        </h4>
-                    </div>
-                    <div id="collapseOne12" class="panel-collapse collapse">
-                        <div class="panel-body">
-
-                            <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab12">
-                                <li class="active"><a href="#info12" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox12" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample12" data-toggle="tab">返回示例</a></li>
-                            </ul>
-
-                            <!-- Tab panes -->
-                            <div class="tab-content">
-
-                                <div class="tab-pane active" id="info12">
-                                    <div class="well">
-                                        首页视频、图片、精美大片入口                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>Headers</strong></div>
-                                        <div class="panel-body">
-                                                                                        <table class="table table-hover">
-                                                <thead>
-                                                    <tr>
-                                                        <th>名称</th>
-                                                        <th>类型</th>
-                                                        <th>必选</th>
-                                                        <th>描述</th>
-                                                    </tr>
-                                                </thead>
-                                                <tbody>
-                                                                                                        <tr>
-                                                        <td>token</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>请求的Token</td>
-                                                    </tr>
-                                                                                                    </tbody>
-                                            </table>
-                                                                                    </div>
-                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>参数</strong></div>
-                                        <div class="panel-body">
-                                                                                        无
-                                                                                    </div>
-                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>正文</strong></div>
-                                        <div class="panel-body">
-                                            无                                        </div>
-                                    </div>
-                                </div><!-- #info -->
-
-                                <div class="tab-pane" id="sandbox12">
-                                    <div class="row">
-                                        <div class="col-md-12">
-                                                                                        <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>Headers</strong></div>
-                                                <div class="panel-body">
-                                                    <div class="headers">
-                                                                                                                <div class="form-group">
-                                                            <label class="control-label" for="token">token</label>
-                                                            <input type="string" class="form-control input-sm" id="token" required placeholder="请求的Token - Ex: " name="token">
-                                                        </div>
-                                                                                                            </div>
-                                                </div>
-                                            </div>
-                                                                                        <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>参数</strong></div>
-                                                <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/index" method="POST" name="form12" id="form12">
-                                                                                                                <div class="form-group">
-                                                            无
-                                                        </div>
-                                                                                                                <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="12">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="12">重置</button>
-                                                        </div>
-                                                    </form>
-                                                </div>
-                                            </div>
-                                            <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>响应输出</strong></div>
-                                                <div class="panel-body">
-                                                    <div class="row">
-                                                        <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers12"></pre>
-                                                            <pre id="response12"></pre>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                            <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>返回参数</strong></div>
-                                                <div class="panel-body">
-                                                                                                        无
-                                                                                                    </div>
-                                            </div>
-                                        </div>
-                                    </div>
-                                </div><!-- #sandbox -->
-
-                                <div class="tab-pane" id="sample12">
-                                    <div class="row">
-                                        <div class="col-md-12">
-                                            <pre id="sample_response12">{
-    'code':'1',
-    'msg':'返回成功',
-    "time": "1571492001",
-        "data": {
-        "video_thumbnail": http://mapwww.baidu.com 视频封面图地址
-        "pic_thumbnail": http://mapwww.baidu.com 图片地址
-        "wonderful_thumbnail": http://mapwww.baidu.com 精美大片地址
-        }
-    }</pre>
-                                        </div>
-                                    </div>
-                                </div><!-- #sample -->
-
-                            </div><!-- .tab-content -->
-                        </div>
-                    </div>
-                </div>
-                                <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-13">
-                        <h4 class="panel-title">
-                            <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion13" href="#collapseOne13"> 地区分类 <span class="text-muted">/api/user/type</span></a>
-                        </h4>
-                    </div>
-                    <div id="collapseOne13" class="panel-collapse collapse">
-                        <div class="panel-body">
-
-                            <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab13">
-                                <li class="active"><a href="#info13" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox13" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample13" data-toggle="tab">返回示例</a></li>
-                            </ul>
-
-                            <!-- Tab panes -->
-                            <div class="tab-content">
-
-                                <div class="tab-pane active" id="info13">
-                                    <div class="well">
-                                        地区分类                                    </div>
+                                        地区分类                                    </div>
                                     <div class="panel panel-default">
                                         <div class="panel-heading"><strong>Headers</strong></div>
                                         <div class="panel-body">
@@ -1817,7 +1255,7 @@
                                     </div>
                                 </div><!-- #info -->
 
-                                <div class="tab-pane" id="sandbox13">
+                                <div class="tab-pane" id="sandbox9">
                                     <div class="row">
                                         <div class="col-md-12">
                                                                                         <div class="panel panel-default">
@@ -1834,13 +1272,13 @@
                                                                                         <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/type" method="POST" name="form13" id="form13">
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/type" method="POST" name="form9" id="form9">
                                                                                                                 <div class="form-group">
                                                             无
                                                         </div>
                                                                                                                 <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="13">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="13">重置</button>
+                                                            <button type="submit" class="btn btn-success send" rel="9">提交</button>
+                                                            <button type="reset" class="btn btn-info" rel="9">重置</button>
                                                         </div>
                                                     </form>
                                                 </div>
@@ -1850,8 +1288,8 @@
                                                 <div class="panel-body">
                                                     <div class="row">
                                                         <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers13"></pre>
-                                                            <pre id="response13"></pre>
+                                                            <pre id="response_headers9"></pre>
+                                                            <pre id="response9"></pre>
                                                         </div>
                                                     </div>
                                                 </div>
@@ -1866,10 +1304,10 @@
                                     </div>
                                 </div><!-- #sandbox -->
 
-                                <div class="tab-pane" id="sample13">
+                                <div class="tab-pane" id="sample9">
                                     <div class="row">
                                         <div class="col-md-12">
-                                            <pre id="sample_response13">{
+                                            <pre id="sample_response9">{
     "code": 1,
     "msg": "成功",
     "time": "1571492001",
@@ -1888,26 +1326,26 @@
                     </div>
                 </div>
                                 <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-14">
+                    <div class="panel-heading" id="heading-10">
                         <h4 class="panel-title">
                             <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion14" href="#collapseOne14"> 搜索页 <span class="text-muted">/api/user/search</span></a>
+                            <a data-toggle="collapse" data-parent="#accordion10" href="#collapseOne10"> 搜索页 <span class="text-muted">/api/user/search</span></a>
                         </h4>
                     </div>
-                    <div id="collapseOne14" class="panel-collapse collapse">
+                    <div id="collapseOne10" class="panel-collapse collapse">
                         <div class="panel-body">
 
                             <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab14">
-                                <li class="active"><a href="#info14" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox14" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample14" data-toggle="tab">返回示例</a></li>
+                            <ul class="nav nav-tabs" id="doctab10">
+                                <li class="active"><a href="#info10" data-toggle="tab">基础信息</a></li>
+                                <li><a href="#sandbox10" data-toggle="tab">在线测试</a></li>
+                                <li><a href="#sample10" data-toggle="tab">返回示例</a></li>
                             </ul>
 
                             <!-- Tab panes -->
                             <div class="tab-content">
 
-                                <div class="tab-pane active" id="info14">
+                                <div class="tab-pane active" id="info10">
                                     <div class="well">
                                         搜索页                                    </div>
                                     <div class="panel panel-default">
@@ -1969,7 +1407,7 @@
                                     </div>
                                 </div><!-- #info -->
 
-                                <div class="tab-pane" id="sandbox14">
+                                <div class="tab-pane" id="sandbox10">
                                     <div class="row">
                                         <div class="col-md-12">
                                                                                         <div class="panel panel-default">
@@ -1986,7 +1424,7 @@
                                                                                         <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/search" method="POST" name="form14" id="form14">
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/search" method="POST" name="form10" id="form10">
                                                                                                                 <div class="form-group">
                                                             <label class="control-label" for="type_id">type_id</label>
                                                             <input type="inter" class="form-control input-sm" id="type_id"  placeholder="视频/图片  (视频为1 图片为2 精美大片为3)" name="type_id">
@@ -1996,8 +1434,8 @@
                                                             <input type="string" class="form-control input-sm" id="keyword" required placeholder="关键字" name="keyword">
                                                         </div>
                                                                                                                 <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="14">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="14">重置</button>
+                                                            <button type="submit" class="btn btn-success send" rel="10">提交</button>
+                                                            <button type="reset" class="btn btn-info" rel="10">重置</button>
                                                         </div>
                                                     </form>
                                                 </div>
@@ -2007,8 +1445,8 @@
                                                 <div class="panel-body">
                                                     <div class="row">
                                                         <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers14"></pre>
-                                                            <pre id="response14"></pre>
+                                                            <pre id="response_headers10"></pre>
+                                                            <pre id="response10"></pre>
                                                         </div>
                                                     </div>
                                                 </div>
@@ -2023,10 +1461,10 @@
                                     </div>
                                 </div><!-- #sandbox -->
 
-                                <div class="tab-pane" id="sample14">
+                                <div class="tab-pane" id="sample10">
                                     <div class="row">
                                         <div class="col-md-12">
-                                            <pre id="sample_response14">{
+                                            <pre id="sample_response10">{
         "code": 1,
         "msg": "成功",
         "time": "1571492001",
@@ -2045,26 +1483,26 @@
                     </div>
                 </div>
                                 <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-15">
+                    <div class="panel-heading" id="heading-11">
                         <h4 class="panel-title">
                             <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion15" href="#collapseOne15"> 图片列表 <span class="text-muted">/api/user/pic</span></a>
+                            <a data-toggle="collapse" data-parent="#accordion11" href="#collapseOne11"> 图片列表 <span class="text-muted">/api/user/pic</span></a>
                         </h4>
                     </div>
-                    <div id="collapseOne15" class="panel-collapse collapse">
+                    <div id="collapseOne11" class="panel-collapse collapse">
                         <div class="panel-body">
 
                             <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab15">
-                                <li class="active"><a href="#info15" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox15" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample15" data-toggle="tab">返回示例</a></li>
+                            <ul class="nav nav-tabs" id="doctab11">
+                                <li class="active"><a href="#info11" data-toggle="tab">基础信息</a></li>
+                                <li><a href="#sandbox11" data-toggle="tab">在线测试</a></li>
+                                <li><a href="#sample11" data-toggle="tab">返回示例</a></li>
                             </ul>
 
                             <!-- Tab panes -->
                             <div class="tab-content">
 
-                                <div class="tab-pane active" id="info15">
+                                <div class="tab-pane active" id="info11">
                                     <div class="well">
                                         图片列表                                    </div>
                                     <div class="panel panel-default">
@@ -2120,7 +1558,7 @@
                                     </div>
                                 </div><!-- #info -->
 
-                                <div class="tab-pane" id="sandbox15">
+                                <div class="tab-pane" id="sandbox11">
                                     <div class="row">
                                         <div class="col-md-12">
                                                                                         <div class="panel panel-default">
@@ -2137,14 +1575,14 @@
                                                                                         <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/pic" method="POST" name="form15" id="form15">
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/pic" method="POST" name="form11" id="form11">
                                                                                                                 <div class="form-group">
                                                             <label class="control-label" for="type_id">type_id</label>
                                                             <input type="inter" class="form-control input-sm" id="type_id"  placeholder="地区ID" name="type_id">
                                                         </div>
                                                                                                                 <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="15">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="15">重置</button>
+                                                            <button type="submit" class="btn btn-success send" rel="11">提交</button>
+                                                            <button type="reset" class="btn btn-info" rel="11">重置</button>
                                                         </div>
                                                     </form>
                                                 </div>
@@ -2154,8 +1592,8 @@
                                                 <div class="panel-body">
                                                     <div class="row">
                                                         <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers15"></pre>
-                                                            <pre id="response15"></pre>
+                                                            <pre id="response_headers11"></pre>
+                                                            <pre id="response11"></pre>
                                                         </div>
                                                     </div>
                                                 </div>
@@ -2170,10 +1608,10 @@
                                     </div>
                                 </div><!-- #sandbox -->
 
-                                <div class="tab-pane" id="sample15">
+                                <div class="tab-pane" id="sample11">
                                     <div class="row">
                                         <div class="col-md-12">
-                                            <pre id="sample_response15">{
+                                            <pre id="sample_response11">{
     "code": 1,
     "msg": "成功",
     "time": "1571492001",
@@ -2191,26 +1629,26 @@
                     </div>
                 </div>
                                 <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-16">
+                    <div class="panel-heading" id="heading-12">
                         <h4 class="panel-title">
                             <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion16" href="#collapseOne16"> 视频列表 <span class="text-muted">/api/user/video</span></a>
+                            <a data-toggle="collapse" data-parent="#accordion12" href="#collapseOne12"> 视频列表 <span class="text-muted">/api/user/video</span></a>
                         </h4>
                     </div>
-                    <div id="collapseOne16" class="panel-collapse collapse">
+                    <div id="collapseOne12" class="panel-collapse collapse">
                         <div class="panel-body">
 
                             <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab16">
-                                <li class="active"><a href="#info16" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox16" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample16" data-toggle="tab">返回示例</a></li>
+                            <ul class="nav nav-tabs" id="doctab12">
+                                <li class="active"><a href="#info12" data-toggle="tab">基础信息</a></li>
+                                <li><a href="#sandbox12" data-toggle="tab">在线测试</a></li>
+                                <li><a href="#sample12" data-toggle="tab">返回示例</a></li>
                             </ul>
 
                             <!-- Tab panes -->
                             <div class="tab-content">
 
-                                <div class="tab-pane active" id="info16">
+                                <div class="tab-pane active" id="info12">
                                     <div class="well">
                                         视频列表                                    </div>
                                     <div class="panel panel-default">
@@ -2266,7 +1704,7 @@
                                     </div>
                                 </div><!-- #info -->
 
-                                <div class="tab-pane" id="sandbox16">
+                                <div class="tab-pane" id="sandbox12">
                                     <div class="row">
                                         <div class="col-md-12">
                                                                                         <div class="panel panel-default">
@@ -2283,14 +1721,14 @@
                                                                                         <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/video" method="POST" name="form16" id="form16">
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/video" method="POST" name="form12" id="form12">
                                                                                                                 <div class="form-group">
                                                             <label class="control-label" for="type_id">type_id</label>
                                                             <input type="inter" class="form-control input-sm" id="type_id"  placeholder="地区ID" name="type_id">
                                                         </div>
                                                                                                                 <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="16">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="16">重置</button>
+                                                            <button type="submit" class="btn btn-success send" rel="12">提交</button>
+                                                            <button type="reset" class="btn btn-info" rel="12">重置</button>
                                                         </div>
                                                     </form>
                                                 </div>
@@ -2300,8 +1738,8 @@
                                                 <div class="panel-body">
                                                     <div class="row">
                                                         <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers16"></pre>
-                                                            <pre id="response16"></pre>
+                                                            <pre id="response_headers12"></pre>
+                                                            <pre id="response12"></pre>
                                                         </div>
                                                     </div>
                                                 </div>
@@ -2316,10 +1754,10 @@
                                     </div>
                                 </div><!-- #sandbox -->
 
-                                <div class="tab-pane" id="sample16">
+                                <div class="tab-pane" id="sample12">
                                     <div class="row">
                                         <div class="col-md-12">
-                                            <pre id="sample_response16">{
+                                            <pre id="sample_response12">{
         "code": 1,
         "msg": "成功",
         "time": "1571492001",
@@ -2338,26 +1776,26 @@
                     </div>
                 </div>
                                 <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-17">
+                    <div class="panel-heading" id="heading-13">
                         <h4 class="panel-title">
                             <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion17" href="#collapseOne17"> 图片详情 <span class="text-muted">/api/user/picdetail</span></a>
+                            <a data-toggle="collapse" data-parent="#accordion13" href="#collapseOne13"> 图片详情 <span class="text-muted">/api/user/picdetail</span></a>
                         </h4>
                     </div>
-                    <div id="collapseOne17" class="panel-collapse collapse">
+                    <div id="collapseOne13" class="panel-collapse collapse">
                         <div class="panel-body">
 
                             <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab17">
-                                <li class="active"><a href="#info17" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox17" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample17" data-toggle="tab">返回示例</a></li>
+                            <ul class="nav nav-tabs" id="doctab13">
+                                <li class="active"><a href="#info13" data-toggle="tab">基础信息</a></li>
+                                <li><a href="#sandbox13" data-toggle="tab">在线测试</a></li>
+                                <li><a href="#sample13" data-toggle="tab">返回示例</a></li>
                             </ul>
 
                             <!-- Tab panes -->
                             <div class="tab-content">
 
-                                <div class="tab-pane active" id="info17">
+                                <div class="tab-pane active" id="info13">
                                     <div class="well">
                                         图片详情                                    </div>
                                     <div class="panel panel-default">
@@ -2413,7 +1851,7 @@
                                     </div>
                                 </div><!-- #info -->
 
-                                <div class="tab-pane" id="sandbox17">
+                                <div class="tab-pane" id="sandbox13">
                                     <div class="row">
                                         <div class="col-md-12">
                                                                                         <div class="panel panel-default">
@@ -2430,14 +1868,14 @@
                                                                                         <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/picdetail" method="POST" name="form17" id="form17">
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/picdetail" method="POST" name="form13" id="form13">
                                                                                                                 <div class="form-group">
                                                             <label class="control-label" for="pic_id">pic_id</label>
                                                             <input type="inter" class="form-control input-sm" id="pic_id" required placeholder="图片ID" name="pic_id">
                                                         </div>
                                                                                                                 <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="17">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="17">重置</button>
+                                                            <button type="submit" class="btn btn-success send" rel="13">提交</button>
+                                                            <button type="reset" class="btn btn-info" rel="13">重置</button>
                                                         </div>
                                                     </form>
                                                 </div>
@@ -2447,8 +1885,8 @@
                                                 <div class="panel-body">
                                                     <div class="row">
                                                         <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers17"></pre>
-                                                            <pre id="response17"></pre>
+                                                            <pre id="response_headers13"></pre>
+                                                            <pre id="response13"></pre>
                                                         </div>
                                                     </div>
                                                 </div>
@@ -2463,10 +1901,10 @@
                                     </div>
                                 </div><!-- #sandbox -->
 
-                                <div class="tab-pane" id="sample17">
+                                <div class="tab-pane" id="sample13">
                                     <div class="row">
                                         <div class="col-md-12">
-                                            <pre id="sample_response17">{
+                                            <pre id="sample_response13">{
         "code": 1,
         "msg": "成功",
         "time": "1571492001",
@@ -2491,26 +1929,26 @@
                     </div>
                 </div>
                                 <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-18">
+                    <div class="panel-heading" id="heading-14">
                         <h4 class="panel-title">
                             <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion18" href="#collapseOne18"> 视频详情 <span class="text-muted">/api/user/videodetail</span></a>
+                            <a data-toggle="collapse" data-parent="#accordion14" href="#collapseOne14"> 视频详情 <span class="text-muted">/api/user/videodetail</span></a>
                         </h4>
                     </div>
-                    <div id="collapseOne18" class="panel-collapse collapse">
+                    <div id="collapseOne14" class="panel-collapse collapse">
                         <div class="panel-body">
 
                             <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab18">
-                                <li class="active"><a href="#info18" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox18" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample18" data-toggle="tab">返回示例</a></li>
+                            <ul class="nav nav-tabs" id="doctab14">
+                                <li class="active"><a href="#info14" data-toggle="tab">基础信息</a></li>
+                                <li><a href="#sandbox14" data-toggle="tab">在线测试</a></li>
+                                <li><a href="#sample14" data-toggle="tab">返回示例</a></li>
                             </ul>
 
                             <!-- Tab panes -->
                             <div class="tab-content">
 
-                                <div class="tab-pane active" id="info18">
+                                <div class="tab-pane active" id="info14">
                                     <div class="well">
                                         视频详情                                    </div>
                                     <div class="panel panel-default">
@@ -2566,7 +2004,7 @@
                                     </div>
                                 </div><!-- #info -->
 
-                                <div class="tab-pane" id="sandbox18">
+                                <div class="tab-pane" id="sandbox14">
                                     <div class="row">
                                         <div class="col-md-12">
                                                                                         <div class="panel panel-default">
@@ -2583,14 +2021,14 @@
                                                                                         <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/videodetail" method="POST" name="form18" id="form18">
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/videodetail" method="POST" name="form14" id="form14">
                                                                                                                 <div class="form-group">
                                                             <label class="control-label" for="video_id">video_id</label>
                                                             <input type="inter" class="form-control input-sm" id="video_id" required placeholder="视频ID" name="video_id">
                                                         </div>
                                                                                                                 <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="18">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="18">重置</button>
+                                                            <button type="submit" class="btn btn-success send" rel="14">提交</button>
+                                                            <button type="reset" class="btn btn-info" rel="14">重置</button>
                                                         </div>
                                                     </form>
                                                 </div>
@@ -2600,8 +2038,8 @@
                                                 <div class="panel-body">
                                                     <div class="row">
                                                         <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers18"></pre>
-                                                            <pre id="response18"></pre>
+                                                            <pre id="response_headers14"></pre>
+                                                            <pre id="response14"></pre>
                                                         </div>
                                                     </div>
                                                 </div>
@@ -2616,10 +2054,10 @@
                                     </div>
                                 </div><!-- #sandbox -->
 
-                                <div class="tab-pane" id="sample18">
+                                <div class="tab-pane" id="sample14">
                                     <div class="row">
                                         <div class="col-md-12">
-                                            <pre id="sample_response18">{
+                                            <pre id="sample_response14">{
         "code": 1,
         "msg": "成功",
         "time": "1571492001",
@@ -2648,26 +2086,26 @@
                     </div>
                 </div>
                                 <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-19">
+                    <div class="panel-heading" id="heading-15">
                         <h4 class="panel-title">
                             <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion19" href="#collapseOne19"> 历史记录 <span class="text-muted">/api/user/history</span></a>
+                            <a data-toggle="collapse" data-parent="#accordion15" href="#collapseOne15"> 历史记录 <span class="text-muted">/api/user/history</span></a>
                         </h4>
                     </div>
-                    <div id="collapseOne19" class="panel-collapse collapse">
+                    <div id="collapseOne15" class="panel-collapse collapse">
                         <div class="panel-body">
 
                             <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab19">
-                                <li class="active"><a href="#info19" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox19" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample19" data-toggle="tab">返回示例</a></li>
+                            <ul class="nav nav-tabs" id="doctab15">
+                                <li class="active"><a href="#info15" data-toggle="tab">基础信息</a></li>
+                                <li><a href="#sandbox15" data-toggle="tab">在线测试</a></li>
+                                <li><a href="#sample15" data-toggle="tab">返回示例</a></li>
                             </ul>
 
                             <!-- Tab panes -->
                             <div class="tab-content">
 
-                                <div class="tab-pane active" id="info19">
+                                <div class="tab-pane active" id="info15">
                                     <div class="well">
                                         历史记录                                    </div>
                                     <div class="panel panel-default">
@@ -2706,7 +2144,7 @@
                                     </div>
                                 </div><!-- #info -->
 
-                                <div class="tab-pane" id="sandbox19">
+                                <div class="tab-pane" id="sandbox15">
                                     <div class="row">
                                         <div class="col-md-12">
                                                                                         <div class="panel panel-default">
@@ -2723,13 +2161,13 @@
                                                                                         <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/history" method="POST" name="form19" id="form19">
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/history" method="POST" name="form15" id="form15">
                                                                                                                 <div class="form-group">
                                                             无
                                                         </div>
                                                                                                                 <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="19">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="19">重置</button>
+                                                            <button type="submit" class="btn btn-success send" rel="15">提交</button>
+                                                            <button type="reset" class="btn btn-info" rel="15">重置</button>
                                                         </div>
                                                     </form>
                                                 </div>
@@ -2739,8 +2177,8 @@
                                                 <div class="panel-body">
                                                     <div class="row">
                                                         <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers19"></pre>
-                                                            <pre id="response19"></pre>
+                                                            <pre id="response_headers15"></pre>
+                                                            <pre id="response15"></pre>
                                                         </div>
                                                     </div>
                                                 </div>
@@ -2755,10 +2193,10 @@
                                     </div>
                                 </div><!-- #sandbox -->
 
-                                <div class="tab-pane" id="sample19">
+                                <div class="tab-pane" id="sample15">
                                     <div class="row">
                                         <div class="col-md-12">
-                                            <pre id="sample_response19">{
+                                            <pre id="sample_response15">{
     "code": 1,
     "msg": "成功",
     "time": "1571492001",
@@ -2776,26 +2214,26 @@
                     </div>
                 </div>
                                 <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-20">
+                    <div class="panel-heading" id="heading-16">
                         <h4 class="panel-title">
                             <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion20" href="#collapseOne20"> 我的 <span class="text-muted">/api/user/mine</span></a>
+                            <a data-toggle="collapse" data-parent="#accordion16" href="#collapseOne16"> 我的 <span class="text-muted">/api/user/mine</span></a>
                         </h4>
                     </div>
-                    <div id="collapseOne20" class="panel-collapse collapse">
+                    <div id="collapseOne16" class="panel-collapse collapse">
                         <div class="panel-body">
 
                             <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab20">
-                                <li class="active"><a href="#info20" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox20" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample20" data-toggle="tab">返回示例</a></li>
+                            <ul class="nav nav-tabs" id="doctab16">
+                                <li class="active"><a href="#info16" data-toggle="tab">基础信息</a></li>
+                                <li><a href="#sandbox16" data-toggle="tab">在线测试</a></li>
+                                <li><a href="#sample16" data-toggle="tab">返回示例</a></li>
                             </ul>
 
                             <!-- Tab panes -->
                             <div class="tab-content">
 
-                                <div class="tab-pane active" id="info20">
+                                <div class="tab-pane active" id="info16">
                                     <div class="well">
                                         我的                                    </div>
                                     <div class="panel panel-default">
@@ -2834,7 +2272,7 @@
                                     </div>
                                 </div><!-- #info -->
 
-                                <div class="tab-pane" id="sandbox20">
+                                <div class="tab-pane" id="sandbox16">
                                     <div class="row">
                                         <div class="col-md-12">
                                                                                         <div class="panel panel-default">
@@ -2851,13 +2289,13 @@
                                                                                         <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/mine" method="POST" name="form20" id="form20">
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/mine" method="POST" name="form16" id="form16">
                                                                                                                 <div class="form-group">
                                                             无
                                                         </div>
                                                                                                                 <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="20">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="20">重置</button>
+                                                            <button type="submit" class="btn btn-success send" rel="16">提交</button>
+                                                            <button type="reset" class="btn btn-info" rel="16">重置</button>
                                                         </div>
                                                     </form>
                                                 </div>
@@ -2867,8 +2305,8 @@
                                                 <div class="panel-body">
                                                     <div class="row">
                                                         <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers20"></pre>
-                                                            <pre id="response20"></pre>
+                                                            <pre id="response_headers16"></pre>
+                                                            <pre id="response16"></pre>
                                                         </div>
                                                     </div>
                                                 </div>
@@ -2883,10 +2321,10 @@
                                     </div>
                                 </div><!-- #sandbox -->
 
-                                <div class="tab-pane" id="sample20">
+                                <div class="tab-pane" id="sample16">
                                     <div class="row">
                                         <div class="col-md-12">
-                                            <pre id="sample_response20">{
+                                            <pre id="sample_response16">{
         "code": 1,
         "msg": "成功",
         "time": "1571492001",
@@ -2905,26 +2343,26 @@
                     </div>
                 </div>
                                 <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-21">
+                    <div class="panel-heading" id="heading-17">
                         <h4 class="panel-title">
                             <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion21" href="#collapseOne21"> 创建充值订单 <span class="text-muted">/api/user/toporder</span></a>
+                            <a data-toggle="collapse" data-parent="#accordion17" href="#collapseOne17"> 创建充值订单 <span class="text-muted">/api/user/toporder</span></a>
                         </h4>
                     </div>
-                    <div id="collapseOne21" class="panel-collapse collapse">
+                    <div id="collapseOne17" class="panel-collapse collapse">
                         <div class="panel-body">
 
                             <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab21">
-                                <li class="active"><a href="#info21" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox21" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample21" data-toggle="tab">返回示例</a></li>
+                            <ul class="nav nav-tabs" id="doctab17">
+                                <li class="active"><a href="#info17" data-toggle="tab">基础信息</a></li>
+                                <li><a href="#sandbox17" data-toggle="tab">在线测试</a></li>
+                                <li><a href="#sample17" data-toggle="tab">返回示例</a></li>
                             </ul>
 
                             <!-- Tab panes -->
                             <div class="tab-content">
 
-                                <div class="tab-pane active" id="info21">
+                                <div class="tab-pane active" id="info17">
                                     <div class="well">
                                         创建充值订单                                    </div>
                                     <div class="panel panel-default">
@@ -2980,7 +2418,7 @@
                                     </div>
                                 </div><!-- #info -->
 
-                                <div class="tab-pane" id="sandbox21">
+                                <div class="tab-pane" id="sandbox17">
                                     <div class="row">
                                         <div class="col-md-12">
                                                                                         <div class="panel panel-default">
@@ -2997,14 +2435,14 @@
                                                                                         <div class="panel panel-default">
                                                 <div class="panel-heading"><strong>参数</strong></div>
                                                 <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/toporder" method="POST" name="form21" id="form21">
+                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/toporder" method="POST" name="form17" id="form17">
                                                                                                                 <div class="form-group">
                                                             <label class="control-label" for="money">money</label>
                                                             <input type="float" class="form-control input-sm" id="money" required placeholder="充值金额" name="money">
                                                         </div>
                                                                                                                 <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="21">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="21">重置</button>
+                                                            <button type="submit" class="btn btn-success send" rel="17">提交</button>
+                                                            <button type="reset" class="btn btn-info" rel="17">重置</button>
                                                         </div>
                                                     </form>
                                                 </div>
@@ -3014,8 +2452,8 @@
                                                 <div class="panel-body">
                                                     <div class="row">
                                                         <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers21"></pre>
-                                                            <pre id="response21"></pre>
+                                                            <pre id="response_headers17"></pre>
+                                                            <pre id="response17"></pre>
                                                         </div>
                                                     </div>
                                                 </div>
@@ -3030,10 +2468,10 @@
                                     </div>
                                 </div><!-- #sandbox -->
 
-                                <div class="tab-pane" id="sample21">
+                                <div class="tab-pane" id="sample17">
                                     <div class="row">
                                         <div class="col-md-12">
-                                            <pre id="sample_response21">{
+                                            <pre id="sample_response17">{
         "code": 1,
         "msg": "成功",
         "time": "1571492001",
@@ -3049,247 +2487,13 @@
                         </div>
                     </div>
                 </div>
-                                <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-22">
-                        <h4 class="panel-title">
-                            <span class="label label-primary">POST</span>
-                            <a data-toggle="collapse" data-parent="#accordion22" href="#collapseOne22"> 充值支付 <span class="text-muted">/api/user/pay</span></a>
-                        </h4>
-                    </div>
-                    <div id="collapseOne22" class="panel-collapse collapse">
-                        <div class="panel-body">
-
-                            <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab22">
-                                <li class="active"><a href="#info22" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox22" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample22" data-toggle="tab">返回示例</a></li>
-                            </ul>
-
-                            <!-- Tab panes -->
-                            <div class="tab-content">
-
-                                <div class="tab-pane active" id="info22">
-                                    <div class="well">
-                                        充值支付                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>Headers</strong></div>
-                                        <div class="panel-body">
-                                                                                        <table class="table table-hover">
-                                                <thead>
-                                                    <tr>
-                                                        <th>名称</th>
-                                                        <th>类型</th>
-                                                        <th>必选</th>
-                                                        <th>描述</th>
-                                                    </tr>
-                                                </thead>
-                                                <tbody>
-                                                                                                        <tr>
-                                                        <td>token</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>请求的Token</td>
-                                                    </tr>
-                                                                                                    </tbody>
-                                            </table>
-                                                                                    </div>
-                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>参数</strong></div>
-                                        <div class="panel-body">
-                                                                                        <table class="table table-hover">
-                                                <thead>
-                                                    <tr>
-                                                        <th>名称</th>
-                                                        <th>类型</th>
-                                                        <th>必选</th>
-                                                        <th>描述</th>
-                                                    </tr>
-                                                </thead>
-                                                <tbody>
-                                                                                                        <tr>
-                                                        <td>order_id</td>
-                                                        <td>inter</td>
-                                                        <td>是</td>
-                                                        <td>订单id</td>
-                                                    </tr>
-                                                                                                    </tbody>
-                                            </table>
-                                                                                    </div>
-                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>正文</strong></div>
-                                        <div class="panel-body">
-                                            无                                        </div>
-                                    </div>
-                                </div><!-- #info -->
-
-                                <div class="tab-pane" id="sandbox22">
-                                    <div class="row">
-                                        <div class="col-md-12">
-                                                                                        <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>Headers</strong></div>
-                                                <div class="panel-body">
-                                                    <div class="headers">
-                                                                                                                <div class="form-group">
-                                                            <label class="control-label" for="token">token</label>
-                                                            <input type="string" class="form-control input-sm" id="token" required placeholder="请求的Token - Ex: " name="token">
-                                                        </div>
-                                                                                                            </div>
-                                                </div>
-                                            </div>
-                                                                                        <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>参数</strong></div>
-                                                <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/pay" method="POST" name="form22" id="form22">
-                                                                                                                <div class="form-group">
-                                                            <label class="control-label" for="order_id">order_id</label>
-                                                            <input type="inter" class="form-control input-sm" id="order_id" required placeholder="订单id" name="order_id">
-                                                        </div>
-                                                                                                                <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="22">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="22">重置</button>
-                                                        </div>
-                                                    </form>
-                                                </div>
-                                            </div>
-                                            <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>响应输出</strong></div>
-                                                <div class="panel-body">
-                                                    <div class="row">
-                                                        <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers22"></pre>
-                                                            <pre id="response22"></pre>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                            <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>返回参数</strong></div>
-                                                <div class="panel-body">
-                                                                                                        无
-                                                                                                    </div>
-                                            </div>
-                                        </div>
-                                    </div>
-                                </div><!-- #sandbox -->
-
-                                <div class="tab-pane" id="sample22">
-                                    <div class="row">
-                                        <div class="col-md-12">
-                                            <pre id="sample_response22">{
-        "code": 1,
-        "msg": "成功",
-        "time": "1571492001",
-        }</pre>
-                                        </div>
-                                    </div>
-                                </div><!-- #sample -->
-
-                            </div><!-- .tab-content -->
-                        </div>
-                    </div>
-                </div>
-                                <div class="panel panel-default">
-                    <div class="panel-heading" id="heading-23">
-                        <h4 class="panel-title">
-                            <span class="label label-success">GET</span>
-                            <a data-toggle="collapse" data-parent="#accordion23" href="#collapseOne23">  <span class="text-muted">/api/user/getopenid</span></a>
-                        </h4>
-                    </div>
-                    <div id="collapseOne23" class="panel-collapse collapse">
-                        <div class="panel-body">
-
-                            <!-- Nav tabs -->
-                            <ul class="nav nav-tabs" id="doctab23">
-                                <li class="active"><a href="#info23" data-toggle="tab">基础信息</a></li>
-                                <li><a href="#sandbox23" data-toggle="tab">在线测试</a></li>
-                                <li><a href="#sample23" data-toggle="tab">返回示例</a></li>
-                            </ul>
-
-                            <!-- Tab panes -->
-                            <div class="tab-content">
-
-                                <div class="tab-pane active" id="info23">
-                                    <div class="well">
-                                                                            </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>Headers</strong></div>
-                                        <div class="panel-body">
-                                                                                        无
-                                                                                    </div>
-                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>参数</strong></div>
-                                        <div class="panel-body">
-                                                                                        无
-                                                                                    </div>
-                                    </div>
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading"><strong>正文</strong></div>
-                                        <div class="panel-body">
-                                            无                                        </div>
-                                    </div>
-                                </div><!-- #info -->
-
-                                <div class="tab-pane" id="sandbox23">
-                                    <div class="row">
-                                        <div class="col-md-12">
-                                                                                        <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>参数</strong></div>
-                                                <div class="panel-body">
-                                                    <form enctype="application/x-www-form-urlencoded" role="form" action="/api/user/getopenid" method="get" name="form23" id="form23">
-                                                                                                                <div class="form-group">
-                                                            无
-                                                        </div>
-                                                                                                                <div class="form-group">
-                                                            <button type="submit" class="btn btn-success send" rel="23">提交</button>
-                                                            <button type="reset" class="btn btn-info" rel="23">重置</button>
-                                                        </div>
-                                                    </form>
-                                                </div>
-                                            </div>
-                                            <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>响应输出</strong></div>
-                                                <div class="panel-body">
-                                                    <div class="row">
-                                                        <div class="col-md-12" style="overflow-x:auto">
-                                                            <pre id="response_headers23"></pre>
-                                                            <pre id="response23"></pre>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                            <div class="panel panel-default">
-                                                <div class="panel-heading"><strong>返回参数</strong></div>
-                                                <div class="panel-body">
-                                                                                                        无
-                                                                                                    </div>
-                                            </div>
-                                        </div>
-                                    </div>
-                                </div><!-- #sandbox -->
-
-                                <div class="tab-pane" id="sample23">
-                                    <div class="row">
-                                        <div class="col-md-12">
-                                            <pre id="sample_response23">无</pre>
-                                        </div>
-                                    </div>
-                                </div><!-- #sample -->
-
-                            </div><!-- .tab-content -->
-                        </div>
-                    </div>
-                </div>
                             </div>
 
             <hr>
 
             <div class="row mt0 footer">
                 <div class="col-md-6" align="left">
-                    Generated on 2019-11-19 22:06:09                </div>
+                    Generated on 2019-11-20 10:55:44                </div>
                 <div class="col-md-6" align="right">
                     <a href="https://www.fastadmin.net" target="_blank">FastAdmin</a>
                 </div>
diff --git a/public/assets/js/backend/user/user.js b/public/assets/js/backend/user/user.js
index 6ecd518..fe1b1b0 100644
--- a/public/assets/js/backend/user/user.js
+++ b/public/assets/js/backend/user/user.js
@@ -25,15 +25,15 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                     [
                         {checkbox: true},
                         {field: 'id', title: __('Id'), sortable: true},
-                        {field: 'group.name', title: __('Group')},
-                        {field: 'username', title: __('Username'), operate: 'LIKE'},
+                        // {field: 'group.name', title: __('Group')},
+                        // {field: 'username', title: __('Username'), operate: 'LIKE'},
                         {field: 'nickname', title: __('Nickname'), operate: 'LIKE'},
-                        {field: 'email', title: __('Email'), operate: 'LIKE'},
-                        {field: 'mobile', title: __('Mobile'), operate: 'LIKE'},
+                        // {field: 'email', title: __('Email'), operate: 'LIKE'},
+                        // {field: 'mobile', title: __('Mobile'), operate: 'LIKE'},
                         {field: 'avatar', title: __('Avatar'), events: Table.api.events.image, formatter: Table.api.formatter.image, operate: false},
-                        {field: 'level', title: __('Level'), operate: 'BETWEEN', sortable: true},
+                        // {field: 'level', title: __('Level'), operate: 'BETWEEN', sortable: true},
                         {field: 'gender', title: __('Gender'), visible: false, searchList: {1: __('Male'), 0: __('Female')}},
-                        {field: 'score', title: __('Score'), operate: 'BETWEEN', sortable: true},
+                        // {field: 'score', title: __('Score'), operate: 'BETWEEN', sortable: true},
                         {field: 'successions', title: __('Successions'), visible: false, operate: 'BETWEEN', sortable: true},
                         {field: 'maxsuccessions', title: __('Maxsuccessions'), visible: false, operate: 'BETWEEN', sortable: true},
                         {field: 'logintime', title: __('Logintime'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
@@ -41,7 +41,9 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                         {field: 'jointime', title: __('Jointime'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
                         {field: 'joinip', title: __('Joinip'), formatter: Table.api.formatter.search},
                         {field: 'status', title: __('Status'), formatter: Table.api.formatter.status, searchList: {normal: __('Normal'), hidden: __('Hidden')}},
-                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
+                        {field: 'money', title: __('账号余额')},
+                        {field: 'is_vip', title: __('是否为会员'),formatter: Table.api.formatter.label,searchList:{'0': '否', '1': '是'}},
+                        // {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
                     ]
                 ]
             });
diff --git a/vendor/autoload.php b/vendor/autoload.php
index 5188a69..eed2569 100644
--- a/vendor/autoload.php
+++ b/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 ComposerAutoloaderInit2537a12e3b63e265e25ee9e73315e195::getLoader();
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
index ac67d30..fce8549 100644
--- a/vendor/composer/ClassLoader.php
+++ b/vendor/composer/ClassLoader.php
@@ -55,6 +55,7 @@ class ClassLoader
     private $classMap = array();
     private $classMapAuthoritative = false;
     private $missingClasses = array();
+    private $apcuPrefix;
 
     public function getPrefixes()
     {
@@ -272,6 +273,26 @@ class ClassLoader
     }
 
     /**
+     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+     *
+     * @param string|null $apcuPrefix
+     */
+    public function setApcuPrefix($apcuPrefix)
+    {
+        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
+    }
+
+    /**
+     * The APCu prefix in use, or null if APCu caching is not enabled.
+     *
+     * @return string|null
+     */
+    public function getApcuPrefix()
+    {
+        return $this->apcuPrefix;
+    }
+
+    /**
      * Registers this instance as an autoloader.
      *
      * @param bool $prepend Whether to prepend the autoloader or not
@@ -313,11 +334,6 @@ class ClassLoader
      */
     public function findFile($class)
     {
-        // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
-        if ('\\' == $class[0]) {
-            $class = substr($class, 1);
-        }
-
         // class map lookup
         if (isset($this->classMap[$class])) {
             return $this->classMap[$class];
@@ -325,6 +341,12 @@ class ClassLoader
         if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
             return false;
         }
+        if (null !== $this->apcuPrefix) {
+            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+            if ($hit) {
+                return $file;
+            }
+        }
 
         $file = $this->findFileWithExtension($class, '.php');
 
@@ -333,6 +355,10 @@ class ClassLoader
             $file = $this->findFileWithExtension($class, '.hh');
         }
 
+        if (null !== $this->apcuPrefix) {
+            apcu_add($this->apcuPrefix.$class, $file);
+        }
+
         if (false === $file) {
             // Remember that this class does not exist.
             $this->missingClasses[$class] = true;
@@ -348,10 +374,14 @@ class ClassLoader
 
         $first = $class[0];
         if (isset($this->prefixLengthsPsr4[$first])) {
-            foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
-                if (0 === strpos($class, $prefix)) {
-                    foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
-                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+            $subPath = $class;
+            while (false !== $lastPos = strrpos($subPath, '\\')) {
+                $subPath = substr($subPath, 0, $lastPos);
+                $search = $subPath . '\\';
+                if (isset($this->prefixDirsPsr4[$search])) {
+                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
+                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
+                        if (file_exists($file = $dir . $pathEnd)) {
                             return $file;
                         }
                     }
diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE
index 1a28124..f27399a 100644
--- a/vendor/composer/LICENSE
+++ b/vendor/composer/LICENSE
@@ -1,5 +1,5 @@
 
-Copyright (c) 2016 Nils Adermann, Jordi Boggiano
+Copyright (c) Nils Adermann, Jordi Boggiano
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index 57056a3..c692e9a 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -6,19 +6,12 @@ $vendorDir = dirname(dirname(__FILE__));
 $baseDir = dirname($vendorDir);
 
 return array(
-    'ArithmeticError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
-    'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
-    'DivisionByZeroError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
     'EasyPeasyICS' => $vendorDir . '/phpmailer/phpmailer/extras/EasyPeasyICS.php',
-    'Error' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/Error.php',
     'PHPMailer' => $vendorDir . '/phpmailer/phpmailer/class.phpmailer.php',
     'PHPMailerOAuth' => $vendorDir . '/phpmailer/phpmailer/class.phpmaileroauth.php',
     'PHPMailerOAuthGoogle' => $vendorDir . '/phpmailer/phpmailer/class.phpmaileroauthgoogle.php',
     'POP3' => $vendorDir . '/phpmailer/phpmailer/class.pop3.php',
-    'ParseError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
     'SMTP' => $vendorDir . '/phpmailer/phpmailer/class.smtp.php',
-    'SessionUpdateTimestampHandlerInterface' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
-    'TypeError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
     'ntlm_sasl_client_class' => $vendorDir . '/phpmailer/phpmailer/extras/ntlm_sasl_client.php',
     'phpmailerException' => $vendorDir . '/phpmailer/phpmailer/class.phpmailer.php',
 );
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index 65465eb..caca6a9 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -6,29 +6,13 @@ $vendorDir = dirname(dirname(__FILE__));
 $baseDir = dirname($vendorDir);
 
 return array(
-    '023d27dca8066ef29e6739335ea73bad' => $vendorDir . '/symfony/polyfill-php70/bootstrap.php',
     '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
+    '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
+    'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php',
     '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
     'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
     'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
     '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
-    '9b552a3cc426e3287cc811caefa3cf53' => $vendorDir . '/topthink/think-helper/src/helper.php',
-    '9d8e013a5160a09477beb8e44f8ae97b' => $vendorDir . '/markbaker/matrix/classes/src/functions/adjoint.php',
-    '6e78d1bdea6248d6aa117229efae50f2' => $vendorDir . '/markbaker/matrix/classes/src/functions/antidiagonal.php',
-    '4623d87924d94f5412fe5afbf1cef31d' => $vendorDir . '/markbaker/matrix/classes/src/functions/cofactors.php',
-    '901fd1f6950a637ca85f66b701a45e13' => $vendorDir . '/markbaker/matrix/classes/src/functions/determinant.php',
-    '83057abc0e4acc99ba80154ee5d02a49' => $vendorDir . '/markbaker/matrix/classes/src/functions/diagonal.php',
-    '07b7fd7a434451149b4fd477fca0ce06' => $vendorDir . '/markbaker/matrix/classes/src/functions/identity.php',
-    'c8d43b340583e07ae89f2a3baef2cf89' => $vendorDir . '/markbaker/matrix/classes/src/functions/inverse.php',
-    '499bb10ed7a3aee2ba4c09a31a85e8d1' => $vendorDir . '/markbaker/matrix/classes/src/functions/minors.php',
-    '1cad2e6414d652e8b1c64e8967f6f37d' => $vendorDir . '/markbaker/matrix/classes/src/functions/trace.php',
-    '95a7f134ac17161d07def442b3b737e8' => $vendorDir . '/markbaker/matrix/classes/src/functions/transpose.php',
-    'b3a6bc628377118d4b4b8ba08d1eb949' => $vendorDir . '/markbaker/matrix/classes/src/operations/add.php',
-    '5fef6d0e407f3f8887266dfa4a6c534c' => $vendorDir . '/markbaker/matrix/classes/src/operations/directsum.php',
-    '684ba247e1385946e3babdaa054119de' => $vendorDir . '/markbaker/matrix/classes/src/operations/subtract.php',
-    'aa53dcba601214d17ad405b7c291b7e8' => $vendorDir . '/markbaker/matrix/classes/src/operations/multiply.php',
-    '75c79eb1b25749b05a47976f32b0d8a2' => $vendorDir . '/markbaker/matrix/classes/src/operations/divideby.php',
-    '6ab8ad87a734f276a6bcd5a0fe1289be' => $vendorDir . '/markbaker/matrix/classes/src/operations/divideinto.php',
     'abede361264e2ae69ec1eee813a101af' => $vendorDir . '/markbaker/complex/classes/src/functions/abs.php',
     '21a5860fbef5be28db5ddfbc3cca67c4' => $vendorDir . '/markbaker/complex/classes/src/functions/acos.php',
     '1546e3f9d127f2a9bb2d1b6c31c26ef1' => $vendorDir . '/markbaker/complex/classes/src/functions/acosh.php',
@@ -71,7 +55,25 @@ return array(
     '883af48563631547925fa4c3b48ead07' => $vendorDir . '/markbaker/complex/classes/src/operations/multiply.php',
     'f190e3308e6ca23234a2875edc985c03' => $vendorDir . '/markbaker/complex/classes/src/operations/divideby.php',
     'ac9e33ce6841aa5bf5d16d465a2f03a7' => $vendorDir . '/markbaker/complex/classes/src/operations/divideinto.php',
-    '9e090711773bfc38738f5dbaee5a7f14' => $vendorDir . '/overtrue/wechat/src/Payment/helpers.php',
-    '1cfd2761b63b0a29ed23657ea394cb2d' => $vendorDir . '/topthink/think-captcha/src/helper.php',
+    '9d8e013a5160a09477beb8e44f8ae97b' => $vendorDir . '/markbaker/matrix/classes/src/functions/adjoint.php',
+    '6e78d1bdea6248d6aa117229efae50f2' => $vendorDir . '/markbaker/matrix/classes/src/functions/antidiagonal.php',
+    '4623d87924d94f5412fe5afbf1cef31d' => $vendorDir . '/markbaker/matrix/classes/src/functions/cofactors.php',
+    '901fd1f6950a637ca85f66b701a45e13' => $vendorDir . '/markbaker/matrix/classes/src/functions/determinant.php',
+    '83057abc0e4acc99ba80154ee5d02a49' => $vendorDir . '/markbaker/matrix/classes/src/functions/diagonal.php',
+    '07b7fd7a434451149b4fd477fca0ce06' => $vendorDir . '/markbaker/matrix/classes/src/functions/identity.php',
+    'c8d43b340583e07ae89f2a3baef2cf89' => $vendorDir . '/markbaker/matrix/classes/src/functions/inverse.php',
+    '499bb10ed7a3aee2ba4c09a31a85e8d1' => $vendorDir . '/markbaker/matrix/classes/src/functions/minors.php',
+    '1cad2e6414d652e8b1c64e8967f6f37d' => $vendorDir . '/markbaker/matrix/classes/src/functions/trace.php',
+    '95a7f134ac17161d07def442b3b737e8' => $vendorDir . '/markbaker/matrix/classes/src/functions/transpose.php',
+    'b3a6bc628377118d4b4b8ba08d1eb949' => $vendorDir . '/markbaker/matrix/classes/src/operations/add.php',
+    '5fef6d0e407f3f8887266dfa4a6c534c' => $vendorDir . '/markbaker/matrix/classes/src/operations/directsum.php',
+    '684ba247e1385946e3babdaa054119de' => $vendorDir . '/markbaker/matrix/classes/src/operations/subtract.php',
+    'aa53dcba601214d17ad405b7c291b7e8' => $vendorDir . '/markbaker/matrix/classes/src/operations/multiply.php',
+    '75c79eb1b25749b05a47976f32b0d8a2' => $vendorDir . '/markbaker/matrix/classes/src/operations/divideby.php',
+    '6ab8ad87a734f276a6bcd5a0fe1289be' => $vendorDir . '/markbaker/matrix/classes/src/operations/divideinto.php',
+    '9b552a3cc426e3287cc811caefa3cf53' => $vendorDir . '/topthink/think-helper/src/helper.php',
     '488987c28e9b5e95a1ce6b6bcb94606c' => $vendorDir . '/karsonzhang/fastadmin-addons/src/common.php',
+    'f0e7e63bbb278a92db02393536748c5f' => $vendorDir . '/overtrue/wechat/src/Kernel/Support/Helpers.php',
+    '6747f579ad6817f318cc3a7e7a0abb93' => $vendorDir . '/overtrue/wechat/src/Kernel/Helpers.php',
+    '1cfd2761b63b0a29ed23657ea394cb2d' => $vendorDir . '/topthink/think-captcha/src/helper.php',
 );
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
index 2feec27..c3cd022 100644
--- a/vendor/composer/autoload_namespaces.php
+++ b/vendor/composer/autoload_namespaces.php
@@ -7,5 +7,4 @@ $baseDir = dirname($vendorDir);
 
 return array(
     'Pimple' => array($vendorDir . '/pimple/pimple/src'),
-    'Doctrine\\Common\\Cache\\' => array($vendorDir . '/doctrine/cache/lib'),
 );
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 30f2160..729b45c 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -9,16 +9,25 @@ return array(
     'think\\helper\\' => array($vendorDir . '/topthink/think-helper/src'),
     'think\\composer\\' => array($vendorDir . '/topthink/think-installer/src'),
     'think\\captcha\\' => array($vendorDir . '/topthink/think-captcha/src'),
-    'think\\' => array($baseDir . '/thinkphp/library/think', $vendorDir . '/karsonzhang/fastadmin-addons/src'),
-    'Symfony\\Polyfill\\Php70\\' => array($vendorDir . '/symfony/polyfill-php70'),
+    'think\\' => array($vendorDir . '/karsonzhang/fastadmin-addons/src', $baseDir . '/thinkphp/library/think'),
+    'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'),
     'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
+    'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'),
+    'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'),
+    'Symfony\\Contracts\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher-contracts'),
+    'Symfony\\Contracts\\Cache\\' => array($vendorDir . '/symfony/cache-contracts'),
+    'Symfony\\Component\\VarExporter\\' => array($vendorDir . '/symfony/var-exporter'),
     'Symfony\\Component\\OptionsResolver\\' => array($vendorDir . '/symfony/options-resolver'),
+    'Symfony\\Component\\Mime\\' => array($vendorDir . '/symfony/mime'),
     'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'),
+    'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'),
+    'Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'),
     'Symfony\\Bridge\\PsrHttpMessage\\' => array($vendorDir . '/symfony/psr-http-message-bridge'),
     'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
     'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
     'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
     'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
+    'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
     'PhpOffice\\PhpSpreadsheet\\' => array($vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet'),
     'Overtrue\\Socialite\\' => array($vendorDir . '/overtrue/socialite/src'),
     'Overtrue\\Pinyin\\' => array($vendorDir . '/overtrue/pinyin/src'),
@@ -29,6 +38,7 @@ return array(
     'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
     'Endroid\\QrCode\\' => array($vendorDir . '/endroid/qr-code/src'),
     'EasyWeChat\\' => array($vendorDir . '/overtrue/wechat/src'),
+    'EasyWeChatComposer\\' => array($vendorDir . '/easywechat-composer/easywechat-composer/src'),
     'Cron\\' => array($vendorDir . '/mtdowling/cron-expression/src/Cron'),
     'Complex\\' => array($vendorDir . '/markbaker/complex/classes/src'),
 );
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
index 99add38..ab9b312 100644
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@ -23,7 +23,7 @@ class ComposerAutoloaderInit2537a12e3b63e265e25ee9e73315e195
         self::$loader = $loader = new \Composer\Autoload\ClassLoader();
         spl_autoload_unregister(array('ComposerAutoloaderInit2537a12e3b63e265e25ee9e73315e195', 'loadClassLoader'));
 
-        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION');
+        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
         if ($useStaticLoader) {
             require_once __DIR__ . '/autoload_static.php';
 
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 26cd8cb..ef95714 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -7,29 +7,13 @@ namespace Composer\Autoload;
 class ComposerStaticInit2537a12e3b63e265e25ee9e73315e195
 {
     public static $files = array (
-        '023d27dca8066ef29e6739335ea73bad' => __DIR__ . '/..' . '/symfony/polyfill-php70/bootstrap.php',
         '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
+        '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
+        'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php',
         '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
         'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
         'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
         '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
-        '9b552a3cc426e3287cc811caefa3cf53' => __DIR__ . '/..' . '/topthink/think-helper/src/helper.php',
-        '9d8e013a5160a09477beb8e44f8ae97b' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/adjoint.php',
-        '6e78d1bdea6248d6aa117229efae50f2' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/antidiagonal.php',
-        '4623d87924d94f5412fe5afbf1cef31d' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/cofactors.php',
-        '901fd1f6950a637ca85f66b701a45e13' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/determinant.php',
-        '83057abc0e4acc99ba80154ee5d02a49' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/diagonal.php',
-        '07b7fd7a434451149b4fd477fca0ce06' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/identity.php',
-        'c8d43b340583e07ae89f2a3baef2cf89' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/inverse.php',
-        '499bb10ed7a3aee2ba4c09a31a85e8d1' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/minors.php',
-        '1cad2e6414d652e8b1c64e8967f6f37d' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/trace.php',
-        '95a7f134ac17161d07def442b3b737e8' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/transpose.php',
-        'b3a6bc628377118d4b4b8ba08d1eb949' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/add.php',
-        '5fef6d0e407f3f8887266dfa4a6c534c' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/directsum.php',
-        '684ba247e1385946e3babdaa054119de' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/subtract.php',
-        'aa53dcba601214d17ad405b7c291b7e8' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/multiply.php',
-        '75c79eb1b25749b05a47976f32b0d8a2' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/divideby.php',
-        '6ab8ad87a734f276a6bcd5a0fe1289be' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/divideinto.php',
         'abede361264e2ae69ec1eee813a101af' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/abs.php',
         '21a5860fbef5be28db5ddfbc3cca67c4' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acos.php',
         '1546e3f9d127f2a9bb2d1b6c31c26ef1' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acosh.php',
@@ -72,9 +56,27 @@ class ComposerStaticInit2537a12e3b63e265e25ee9e73315e195
         '883af48563631547925fa4c3b48ead07' => __DIR__ . '/..' . '/markbaker/complex/classes/src/operations/multiply.php',
         'f190e3308e6ca23234a2875edc985c03' => __DIR__ . '/..' . '/markbaker/complex/classes/src/operations/divideby.php',
         'ac9e33ce6841aa5bf5d16d465a2f03a7' => __DIR__ . '/..' . '/markbaker/complex/classes/src/operations/divideinto.php',
-        '9e090711773bfc38738f5dbaee5a7f14' => __DIR__ . '/..' . '/overtrue/wechat/src/Payment/helpers.php',
-        '1cfd2761b63b0a29ed23657ea394cb2d' => __DIR__ . '/..' . '/topthink/think-captcha/src/helper.php',
+        '9d8e013a5160a09477beb8e44f8ae97b' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/adjoint.php',
+        '6e78d1bdea6248d6aa117229efae50f2' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/antidiagonal.php',
+        '4623d87924d94f5412fe5afbf1cef31d' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/cofactors.php',
+        '901fd1f6950a637ca85f66b701a45e13' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/determinant.php',
+        '83057abc0e4acc99ba80154ee5d02a49' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/diagonal.php',
+        '07b7fd7a434451149b4fd477fca0ce06' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/identity.php',
+        'c8d43b340583e07ae89f2a3baef2cf89' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/inverse.php',
+        '499bb10ed7a3aee2ba4c09a31a85e8d1' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/minors.php',
+        '1cad2e6414d652e8b1c64e8967f6f37d' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/trace.php',
+        '95a7f134ac17161d07def442b3b737e8' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/transpose.php',
+        'b3a6bc628377118d4b4b8ba08d1eb949' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/add.php',
+        '5fef6d0e407f3f8887266dfa4a6c534c' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/directsum.php',
+        '684ba247e1385946e3babdaa054119de' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/subtract.php',
+        'aa53dcba601214d17ad405b7c291b7e8' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/multiply.php',
+        '75c79eb1b25749b05a47976f32b0d8a2' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/divideby.php',
+        '6ab8ad87a734f276a6bcd5a0fe1289be' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/divideinto.php',
+        '9b552a3cc426e3287cc811caefa3cf53' => __DIR__ . '/..' . '/topthink/think-helper/src/helper.php',
         '488987c28e9b5e95a1ce6b6bcb94606c' => __DIR__ . '/..' . '/karsonzhang/fastadmin-addons/src/common.php',
+        'f0e7e63bbb278a92db02393536748c5f' => __DIR__ . '/..' . '/overtrue/wechat/src/Kernel/Support/Helpers.php',
+        '6747f579ad6817f318cc3a7e7a0abb93' => __DIR__ . '/..' . '/overtrue/wechat/src/Kernel/Helpers.php',
+        '1cfd2761b63b0a29ed23657ea394cb2d' => __DIR__ . '/..' . '/topthink/think-captcha/src/helper.php',
     );
 
     public static $prefixLengthsPsr4 = array (
@@ -87,10 +89,18 @@ class ComposerStaticInit2537a12e3b63e265e25ee9e73315e195
         ),
         'S' => 
         array (
-            'Symfony\\Polyfill\\Php70\\' => 23,
+            'Symfony\\Polyfill\\Php72\\' => 23,
             'Symfony\\Polyfill\\Mbstring\\' => 26,
+            'Symfony\\Polyfill\\Intl\\Idn\\' => 26,
+            'Symfony\\Contracts\\Service\\' => 26,
+            'Symfony\\Contracts\\EventDispatcher\\' => 34,
+            'Symfony\\Contracts\\Cache\\' => 24,
+            'Symfony\\Component\\VarExporter\\' => 30,
             'Symfony\\Component\\OptionsResolver\\' => 34,
+            'Symfony\\Component\\Mime\\' => 23,
             'Symfony\\Component\\HttpFoundation\\' => 33,
+            'Symfony\\Component\\EventDispatcher\\' => 34,
+            'Symfony\\Component\\Cache\\' => 24,
             'Symfony\\Bridge\\PsrHttpMessage\\' => 30,
         ),
         'P' => 
@@ -99,6 +109,7 @@ class ComposerStaticInit2537a12e3b63e265e25ee9e73315e195
             'Psr\\Log\\' => 8,
             'Psr\\Http\\Message\\' => 17,
             'Psr\\Container\\' => 14,
+            'Psr\\Cache\\' => 10,
             'PhpOffice\\PhpSpreadsheet\\' => 25,
         ),
         'O' => 
@@ -121,6 +132,7 @@ class ComposerStaticInit2537a12e3b63e265e25ee9e73315e195
         array (
             'Endroid\\QrCode\\' => 15,
             'EasyWeChat\\' => 11,
+            'EasyWeChatComposer\\' => 19,
         ),
         'C' => 
         array (
@@ -144,25 +156,57 @@ class ComposerStaticInit2537a12e3b63e265e25ee9e73315e195
         ),
         'think\\' => 
         array (
-            0 => __DIR__ . '/../..' . '/thinkphp/library/think',
-            1 => __DIR__ . '/..' . '/karsonzhang/fastadmin-addons/src',
+            0 => __DIR__ . '/..' . '/karsonzhang/fastadmin-addons/src',
+            1 => __DIR__ . '/../..' . '/thinkphp/library/think',
         ),
-        'Symfony\\Polyfill\\Php70\\' => 
+        'Symfony\\Polyfill\\Php72\\' => 
         array (
-            0 => __DIR__ . '/..' . '/symfony/polyfill-php70',
+            0 => __DIR__ . '/..' . '/symfony/polyfill-php72',
         ),
         'Symfony\\Polyfill\\Mbstring\\' => 
         array (
             0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
         ),
+        'Symfony\\Polyfill\\Intl\\Idn\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn',
+        ),
+        'Symfony\\Contracts\\Service\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/service-contracts',
+        ),
+        'Symfony\\Contracts\\EventDispatcher\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts',
+        ),
+        'Symfony\\Contracts\\Cache\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/cache-contracts',
+        ),
+        'Symfony\\Component\\VarExporter\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/var-exporter',
+        ),
         'Symfony\\Component\\OptionsResolver\\' => 
         array (
             0 => __DIR__ . '/..' . '/symfony/options-resolver',
         ),
+        'Symfony\\Component\\Mime\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/mime',
+        ),
         'Symfony\\Component\\HttpFoundation\\' => 
         array (
             0 => __DIR__ . '/..' . '/symfony/http-foundation',
         ),
+        'Symfony\\Component\\EventDispatcher\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/event-dispatcher',
+        ),
+        'Symfony\\Component\\Cache\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/cache',
+        ),
         'Symfony\\Bridge\\PsrHttpMessage\\' => 
         array (
             0 => __DIR__ . '/..' . '/symfony/psr-http-message-bridge',
@@ -183,6 +227,10 @@ class ComposerStaticInit2537a12e3b63e265e25ee9e73315e195
         array (
             0 => __DIR__ . '/..' . '/psr/container/src',
         ),
+        'Psr\\Cache\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/cache/src',
+        ),
         'PhpOffice\\PhpSpreadsheet\\' => 
         array (
             0 => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet',
@@ -223,6 +271,10 @@ class ComposerStaticInit2537a12e3b63e265e25ee9e73315e195
         array (
             0 => __DIR__ . '/..' . '/overtrue/wechat/src',
         ),
+        'EasyWeChatComposer\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/easywechat-composer/easywechat-composer/src',
+        ),
         'Cron\\' => 
         array (
             0 => __DIR__ . '/..' . '/mtdowling/cron-expression/src/Cron',
@@ -241,29 +293,15 @@ class ComposerStaticInit2537a12e3b63e265e25ee9e73315e195
                 0 => __DIR__ . '/..' . '/pimple/pimple/src',
             ),
         ),
-        'D' => 
-        array (
-            'Doctrine\\Common\\Cache\\' => 
-            array (
-                0 => __DIR__ . '/..' . '/doctrine/cache/lib',
-            ),
-        ),
     );
 
     public static $classMap = array (
-        'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
-        'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
-        'DivisionByZeroError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
         'EasyPeasyICS' => __DIR__ . '/..' . '/phpmailer/phpmailer/extras/EasyPeasyICS.php',
-        'Error' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/Error.php',
         'PHPMailer' => __DIR__ . '/..' . '/phpmailer/phpmailer/class.phpmailer.php',
         'PHPMailerOAuth' => __DIR__ . '/..' . '/phpmailer/phpmailer/class.phpmaileroauth.php',
         'PHPMailerOAuthGoogle' => __DIR__ . '/..' . '/phpmailer/phpmailer/class.phpmaileroauthgoogle.php',
         'POP3' => __DIR__ . '/..' . '/phpmailer/phpmailer/class.pop3.php',
-        'ParseError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
         'SMTP' => __DIR__ . '/..' . '/phpmailer/phpmailer/class.smtp.php',
-        'SessionUpdateTimestampHandlerInterface' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
-        'TypeError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
         'ntlm_sasl_client_class' => __DIR__ . '/..' . '/phpmailer/phpmailer/extras/ntlm_sasl_client.php',
         'phpmailerException' => __DIR__ . '/..' . '/phpmailer/phpmailer/class.phpmailer.php',
     );
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 2ef5e27..eb199a6 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1,52 +1,49 @@
 [
     {
-        "name": "topthink/think-installer",
-        "version": "v1.0.12",
-        "version_normalized": "1.0.12.0",
+        "name": "easywechat-composer/easywechat-composer",
+        "version": "1.2.0",
+        "version_normalized": "1.2.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/top-think/think-installer.git",
-            "reference": "1be326e68f63de4e95977ed50f46ae75f017556d"
+            "url": "https://github.com/mingyoung/easywechat-composer.git",
+            "reference": "bebd2fee768c5e47449d0317067f43bab10fe1eb"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-installer/zipball/1be326e68f63de4e95977ed50f46ae75f017556d",
-            "reference": "1be326e68f63de4e95977ed50f46ae75f017556d",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/mingyoung/easywechat-composer/zipball/bebd2fee768c5e47449d0317067f43bab10fe1eb",
+            "reference": "bebd2fee768c5e47449d0317067f43bab10fe1eb",
+            "shasum": ""
         },
         "require": {
-            "composer-plugin-api": "^1.0"
+            "composer-plugin-api": "^1.0",
+            "php": ">=7.0"
         },
         "require-dev": {
-            "composer/composer": "1.0.*@dev"
+            "composer/composer": "^1.0",
+            "phpunit/phpunit": "^6.5 || ^7.0"
         },
-        "time": "2017-05-27 06:58:09",
+        "time": "2019-09-19T13:39:05+00:00",
         "type": "composer-plugin",
         "extra": {
-            "class": "think\\composer\\Plugin"
+            "class": "EasyWeChatComposer\\Plugin"
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "think\\composer\\": "src"
+                "EasyWeChatComposer\\": "src/"
             }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "Apache-2.0"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "yunwuxin",
-                "email": "448901948@qq.com"
+                "name": "张铭阳",
+                "email": "mingyoungcheung@gmail.com"
             }
-        ]
+        ],
+        "description": "The composer plugin for EasyWeChat"
     },
     {
         "name": "endroid/qr-code",
@@ -61,13 +58,7 @@
             "type": "zip",
             "url": "https://api.github.com/repos/endroid/qr-code/zipball/c9644bec2a9cc9318e98d1437de3c628dcd1ef93",
             "reference": "c9644bec2a9cc9318e98d1437de3c628dcd1ef93",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "shasum": ""
         },
         "require": {
             "ext-gd": "*",
@@ -81,7 +72,7 @@
             "symfony/framework-bundle": "^2.3|^3.0",
             "symfony/http-kernel": "^2.3|^3.0"
         },
-        "time": "2017-04-08 09:13:59",
+        "time": "2017-04-08T09:13:59+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -117,6 +108,74 @@
         ]
     },
     {
+        "name": "guzzlehttp/guzzle",
+        "version": "6.4.1",
+        "version_normalized": "6.4.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/guzzle/guzzle.git",
+            "reference": "0895c932405407fd3a7368b6910c09a24d26db11"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0895c932405407fd3a7368b6910c09a24d26db11",
+            "reference": "0895c932405407fd3a7368b6910c09a24d26db11",
+            "shasum": ""
+        },
+        "require": {
+            "ext-json": "*",
+            "guzzlehttp/promises": "^1.0",
+            "guzzlehttp/psr7": "^1.6.1",
+            "php": ">=5.5"
+        },
+        "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"
+        },
+        "time": "2019-10-23T15:58:00+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "6.3-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "GuzzleHttp\\": "src/"
+            },
+            "files": [
+                "src/functions_include.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Michael Dowling",
+                "email": "mtdowling@gmail.com",
+                "homepage": "https://github.com/mtdowling"
+            }
+        ],
+        "description": "Guzzle is a PHP HTTP client library",
+        "homepage": "http://guzzlephp.org/",
+        "keywords": [
+            "client",
+            "curl",
+            "framework",
+            "http",
+            "http client",
+            "rest",
+            "web service"
+        ]
+    },
+    {
         "name": "guzzlehttp/promises",
         "version": "v1.3.1",
         "version_normalized": "1.3.1.0",
@@ -129,13 +188,7 @@
             "type": "zip",
             "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
             "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "shasum": ""
         },
         "require": {
             "php": ">=5.5.0"
@@ -143,7 +196,7 @@
         "require-dev": {
             "phpunit/phpunit": "^4.0"
         },
-        "time": "2016-12-20 10:07:11",
+        "time": "2016-12-20T10:07:11+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -176,41 +229,50 @@
         ]
     },
     {
-        "name": "psr/http-message",
-        "version": "1.0.1",
-        "version_normalized": "1.0.1.0",
+        "name": "guzzlehttp/psr7",
+        "version": "1.6.1",
+        "version_normalized": "1.6.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/php-fig/http-message.git",
-            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+            "url": "https://github.com/guzzle/psr7.git",
+            "reference": "239400de7a173fe9901b9ac7c06497751f00727a"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
-            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
+            "reference": "239400de7a173fe9901b9ac7c06497751f00727a",
+            "shasum": ""
         },
         "require": {
-            "php": ">=5.3.0"
+            "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.8"
+        },
+        "suggest": {
+            "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
         },
-        "time": "2016-08-06 14:39:51",
+        "time": "2019-07-01T23:21:34+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.0.x-dev"
+                "dev-master": "1.6-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Psr\\Http\\Message\\": "src/"
-            }
+                "GuzzleHttp\\Psr7\\": "src/"
+            },
+            "files": [
+                "src/functions_include.php"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -218,51 +280,61 @@
         ],
         "authors": [
             {
-                "name": "PHP-FIG",
-                "homepage": "http://www.php-fig.org/"
+                "name": "Michael Dowling",
+                "email": "mtdowling@gmail.com",
+                "homepage": "https://github.com/mtdowling"
+            },
+            {
+                "name": "Tobias Schultze",
+                "homepage": "https://github.com/Tobion"
             }
         ],
-        "description": "Common interface for HTTP messages",
-        "homepage": "https://github.com/php-fig/http-message",
+        "description": "PSR-7 message implementation that also provides common utility methods",
         "keywords": [
             "http",
-            "http-message",
-            "psr",
+            "message",
             "psr-7",
             "request",
-            "response"
+            "response",
+            "stream",
+            "uri",
+            "url"
         ]
     },
     {
-        "name": "topthink/think-helper",
-        "version": "v3.0.0",
-        "version_normalized": "3.0.0.0",
+        "name": "karsonzhang/fastadmin-addons",
+        "version": "1.1.9",
+        "version_normalized": "1.1.9.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/top-think/think-helper.git",
-            "reference": "8ba5f66e68106369fcc3211e7d2dbaf7bc9ce455"
+            "url": "https://github.com/karsonzhang/fastadmin-addons.git",
+            "reference": "c539b1c4aa99ea8c453cbd3a838f523136bc118a"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-helper/zipball/8ba5f66e68106369fcc3211e7d2dbaf7bc9ce455",
-            "reference": "8ba5f66e68106369fcc3211e7d2dbaf7bc9ce455",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/karsonzhang/fastadmin-addons/zipball/c539b1c4aa99ea8c453cbd3a838f523136bc118a",
+            "reference": "c539b1c4aa99ea8c453cbd3a838f523136bc118a",
+            "shasum": ""
         },
-        "time": "2019-03-14 09:28:59",
+        "require": {
+            "php": ">=5.4.0",
+            "topthink/think-helper": ">=1.0.4",
+            "topthink/think-installer": ">=1.0.10"
+        },
+        "time": "2019-06-11T09:05:52+00:00",
         "type": "library",
+        "extra": {
+            "think-config": {
+                "addons": "src/config.php"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "think\\helper\\": "src"
+                "think\\": "src/"
             },
             "files": [
-                "src/helper.php"
+                "src/common.php"
             ]
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -271,46 +343,96 @@
         ],
         "authors": [
             {
-                "name": "yunwuxin",
-                "email": "448901948@qq.com"
+                "name": "xiaobo.sun",
+                "email": "xiaobo.sun@qq.com"
+            },
+            {
+                "name": "karsonzhang",
+                "email": "karsonzhang@163.com"
             }
         ],
-        "description": "The ThinkPHP5 Helper Package"
+        "description": "addons package for fastadmin",
+        "homepage": "https://github.com/karsonzhang/fastadmin-addons"
     },
     {
-        "name": "mtdowling/cron-expression",
-        "version": "v1.2.1",
-        "version_normalized": "1.2.1.0",
+        "name": "markbaker/complex",
+        "version": "1.4.7",
+        "version_normalized": "1.4.7.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/mtdowling/cron-expression.git",
-            "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad"
+            "url": "https://github.com/MarkBaker/PHPComplex.git",
+            "reference": "1ea674a8308baf547cbcbd30c5fcd6d301b7c000"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad",
-            "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/1ea674a8308baf547cbcbd30c5fcd6d301b7c000",
+            "reference": "1ea674a8308baf547cbcbd30c5fcd6d301b7c000",
+            "shasum": ""
         },
         "require": {
-            "php": ">=5.3.2"
+            "php": "^5.6.0|^7.0.0"
         },
         "require-dev": {
-            "phpunit/phpunit": "~4.0|~5.0"
+            "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3",
+            "phpcompatibility/php-compatibility": "^8.0",
+            "phpdocumentor/phpdocumentor": "2.*",
+            "phploc/phploc": "2.*",
+            "phpmd/phpmd": "2.*",
+            "phpunit/phpunit": "^4.8.35|^5.4.0",
+            "sebastian/phpcpd": "2.*",
+            "squizlabs/php_codesniffer": "^3.3.0"
         },
-        "time": "2017-01-23 04:29:33",
+        "time": "2018-10-13T23:28:42+00:00",
         "type": "library",
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Cron\\": "src/Cron/"
-            }
+                "Complex\\": "classes/src/"
+            },
+            "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"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -318,51 +440,70 @@
         ],
         "authors": [
             {
-                "name": "Michael Dowling",
-                "email": "mtdowling@gmail.com",
-                "homepage": "https://github.com/mtdowling"
+                "name": "Mark Baker",
+                "email": "mark@lange.demon.co.uk"
             }
         ],
-        "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due",
+        "description": "PHP Class for working with complex numbers",
+        "homepage": "https://github.com/MarkBaker/PHPComplex",
         "keywords": [
-            "cron",
-            "schedule"
+            "complex",
+            "mathematics"
         ]
     },
     {
-        "name": "overtrue/pinyin",
-        "version": "3.0.6",
-        "version_normalized": "3.0.6.0",
+        "name": "markbaker/matrix",
+        "version": "1.1.4",
+        "version_normalized": "1.1.4.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/overtrue/pinyin.git",
-            "reference": "3b781d267197b74752daa32814d3a2cf5d140779"
+            "url": "https://github.com/MarkBaker/PHPMatrix.git",
+            "reference": "6ea97472b5baf12119b4f31f802835b820dd6d64"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/overtrue/pinyin/zipball/3b781d267197b74752daa32814d3a2cf5d140779",
-            "reference": "3b781d267197b74752daa32814d3a2cf5d140779",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/6ea97472b5baf12119b4f31f802835b820dd6d64",
+            "reference": "6ea97472b5baf12119b4f31f802835b820dd6d64",
+            "shasum": ""
         },
         "require": {
-            "php": ">=5.3"
+            "php": "^5.6.0|^7.0.0"
         },
         "require-dev": {
-            "phpunit/phpunit": "~4.8"
+            "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3",
+            "phpcompatibility/php-compatibility": "^8.0",
+            "phpdocumentor/phpdocumentor": "2.*",
+            "phploc/phploc": "2.*",
+            "phpmd/phpmd": "2.*",
+            "phpunit/phpunit": "^4.8.35|^5.4.0",
+            "sebastian/phpcpd": "2.*",
+            "squizlabs/php_codesniffer": "^3.3.0"
         },
-        "time": "2017-07-10 07:20:01",
+        "time": "2018-11-04T22:12:12+00:00",
         "type": "library",
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Overtrue\\Pinyin\\": "src/"
-            }
+                "Matrix\\": "classes/src/"
+            },
+            "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"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -370,114 +511,129 @@
         ],
         "authors": [
             {
-                "name": "Carlos",
-                "homepage": "http://github.com/overtrue"
+                "name": "Mark Baker",
+                "email": "mark@lange.demon.co.uk"
             }
         ],
-        "description": "Chinese to pinyin translator.",
-        "homepage": "https://github.com/overtrue/pinyin",
+        "description": "PHP Class for working with matrices",
+        "homepage": "https://github.com/MarkBaker/PHPMatrix",
         "keywords": [
-            "Chinese",
-            "Pinyin",
-            "cn2pinyin"
+            "mathematics",
+            "matrix",
+            "vector"
         ]
     },
     {
-        "name": "paragonie/random_compat",
-        "version": "v9.99.99",
-        "version_normalized": "9.99.99.0",
+        "name": "monolog/monolog",
+        "version": "2.0.1",
+        "version_normalized": "2.0.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/paragonie/random_compat.git",
-            "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95"
+            "url": "https://github.com/Seldaek/monolog.git",
+            "reference": "f9d56fd2f5533322caccdfcddbb56aedd622ef1c"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
-            "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f9d56fd2f5533322caccdfcddbb56aedd622ef1c",
+            "reference": "f9d56fd2f5533322caccdfcddbb56aedd622ef1c",
+            "shasum": ""
         },
         "require": {
-            "php": "^7"
+            "php": "^7.2",
+            "psr/log": "^1.0.1"
+        },
+        "provide": {
+            "psr/log-implementation": "1.0.0"
         },
         "require-dev": {
-            "phpunit/phpunit": "4.*|5.*",
-            "vimeo/psalm": "^1"
+            "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+            "doctrine/couchdb": "~1.0@dev",
+            "elasticsearch/elasticsearch": "^6.0",
+            "graylog2/gelf-php": "^1.4.2",
+            "jakub-onderka/php-parallel-lint": "^0.9",
+            "php-amqplib/php-amqplib": "~2.4",
+            "php-console/php-console": "^3.1.3",
+            "phpspec/prophecy": "^1.6.1",
+            "phpunit/phpunit": "^8.3",
+            "predis/predis": "^1.1",
+            "rollbar/rollbar": "^1.3",
+            "ruflin/elastica": ">=0.90 <3.0",
+            "swiftmailer/swiftmailer": "^5.3|^6.0"
         },
         "suggest": {
-            "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+            "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-mbstring": "Allow to work properly with unicode symbols",
+            "ext-mongodb": "Allow sending log messages to a MongoDB server (via 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",
+            "php-console/php-console": "Allow sending log messages to Google Chrome",
+            "rollbar/rollbar": "Allow sending log messages to Rollbar",
+            "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
         },
-        "time": "2018-07-02 15:55:56",
+        "time": "2019-11-13T10:27:43+00:00",
         "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.x-dev"
+            }
+        },
         "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Monolog\\": "src/Monolog"
+            }
+        },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
             "MIT"
         ],
         "authors": [
             {
-                "name": "Paragon Initiative Enterprises",
-                "email": "security@paragonie.com",
-                "homepage": "https://paragonie.com"
+                "name": "Jordi Boggiano",
+                "email": "j.boggiano@seld.be",
+                "homepage": "http://seld.be"
             }
         ],
-        "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+        "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+        "homepage": "http://github.com/Seldaek/monolog",
         "keywords": [
-            "csprng",
-            "polyfill",
-            "pseudorandom",
-            "random"
+            "log",
+            "logging",
+            "psr-3"
         ]
     },
     {
-        "name": "symfony/polyfill-php70",
-        "version": "v1.11.0",
-        "version_normalized": "1.11.0.0",
+        "name": "mtdowling/cron-expression",
+        "version": "v1.2.1",
+        "version_normalized": "1.2.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/polyfill-php70.git",
-            "reference": "bc4858fb611bda58719124ca079baff854149c89"
+            "url": "https://github.com/mtdowling/cron-expression.git",
+            "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/bc4858fb611bda58719124ca079baff854149c89",
-            "reference": "bc4858fb611bda58719124ca079baff854149c89",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad",
+            "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad",
+            "shasum": ""
         },
         "require": {
-            "paragonie/random_compat": "~1.0|~2.0|~9.99",
-            "php": ">=5.3.3"
+            "php": ">=5.3.2"
         },
-        "time": "2019-02-06 07:57:58",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.11-dev"
-            }
+        "require-dev": {
+            "phpunit/phpunit": "~4.0|~5.0"
         },
+        "time": "2017-01-23T04:29:33+00:00",
+        "type": "library",
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Symfony\\Polyfill\\Php70\\": ""
-            },
-            "files": [
-                "bootstrap.php"
-            ],
-            "classmap": [
-                "Resources/stubs"
-            ]
+                "Cron\\": "src/Cron/"
+            }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -485,65 +641,45 @@
         ],
         "authors": [
             {
-                "name": "Nicolas Grekas",
-                "email": "p@tchwork.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
+                "name": "Michael Dowling",
+                "email": "mtdowling@gmail.com",
+                "homepage": "https://github.com/mtdowling"
             }
         ],
-        "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
-        "homepage": "https://symfony.com",
+        "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due",
         "keywords": [
-            "compatibility",
-            "polyfill",
-            "portable",
-            "shim"
+            "cron",
+            "schedule"
         ]
     },
     {
-        "name": "symfony/polyfill-mbstring",
-        "version": "v1.11.0",
-        "version_normalized": "1.11.0.0",
+        "name": "overtrue/pinyin",
+        "version": "3.0.6",
+        "version_normalized": "3.0.6.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/polyfill-mbstring.git",
-            "reference": "fe5e94c604826c35a32fa832f35bd036b6799609"
+            "url": "https://github.com/overtrue/pinyin.git",
+            "reference": "3b781d267197b74752daa32814d3a2cf5d140779"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609",
-            "reference": "fe5e94c604826c35a32fa832f35bd036b6799609",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/overtrue/pinyin/zipball/3b781d267197b74752daa32814d3a2cf5d140779",
+            "reference": "3b781d267197b74752daa32814d3a2cf5d140779",
+            "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
+            "php": ">=5.3"
         },
-        "suggest": {
-            "ext-mbstring": "For best performance"
+        "require-dev": {
+            "phpunit/phpunit": "~4.8"
         },
-        "time": "2019-02-06 07:57:58",
+        "time": "2017-07-10T07:20:01+00:00",
         "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.11-dev"
-            }
-        },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Symfony\\Polyfill\\Mbstring\\": ""
-            },
-            "files": [
-                "bootstrap.php"
-            ]
+                "Overtrue\\Pinyin\\": "src/"
+            }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -551,73 +687,52 @@
         ],
         "authors": [
             {
-                "name": "Nicolas Grekas",
-                "email": "p@tchwork.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
+                "name": "Carlos",
+                "homepage": "http://github.com/overtrue"
             }
         ],
-        "description": "Symfony polyfill for the Mbstring extension",
-        "homepage": "https://symfony.com",
+        "description": "Chinese to pinyin translator.",
+        "homepage": "https://github.com/overtrue/pinyin",
         "keywords": [
-            "compatibility",
-            "mbstring",
-            "polyfill",
-            "portable",
-            "shim"
+            "Chinese",
+            "Pinyin",
+            "cn2pinyin"
         ]
     },
     {
-        "name": "symfony/psr-http-message-bridge",
-        "version": "v1.2.0",
-        "version_normalized": "1.2.0.0",
+        "name": "overtrue/socialite",
+        "version": "2.0.12",
+        "version_normalized": "2.0.12.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/psr-http-message-bridge.git",
-            "reference": "9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad"
+            "url": "https://github.com/overtrue/socialite.git",
+            "reference": "f182ae99bf85e191982b68fcd02e464acaa72888"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad",
-            "reference": "9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/overtrue/socialite/zipball/f182ae99bf85e191982b68fcd02e464acaa72888",
+            "reference": "f182ae99bf85e191982b68fcd02e464acaa72888",
+            "shasum": ""
         },
         "require": {
-            "php": "^7.1",
-            "psr/http-message": "^1.0",
-            "symfony/http-foundation": "^3.4 || ^4.0"
-        },
-        "require-dev": {
-            "nyholm/psr7": "^1.1",
-            "symfony/phpunit-bridge": "^3.4.20 || ^4.0",
-            "zendframework/zend-diactoros": "^1.4.1 || ^2.0"
+            "guzzlehttp/guzzle": "~5.0|~6.0",
+            "php": ">=7.0",
+            "symfony/http-foundation": "^2.7|^3.0|^4.0"
         },
-        "suggest": {
-            "nyholm/psr7": "For a super lightweight PSR-7/17 implementation"
+        "conflict": {
+            "socialiteproviders/weixin": "*"
         },
-        "time": "2019-03-11 18:22:33",
-        "type": "symfony-bridge",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.2-dev"
-            }
+        "require-dev": {
+            "mockery/mockery": "~1.2",
+            "phpunit/phpunit": "~6"
         },
+        "time": "2019-10-24T11:12:17+00:00",
+        "type": "library",
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Symfony\\Bridge\\PsrHttpMessage\\": ""
-            },
-            "exclude-from-classmap": [
-                "/Tests/"
-            ]
+                "Overtrue\\Socialite\\": "src/"
+            }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -625,78 +740,261 @@
         ],
         "authors": [
             {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
-            },
-            {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
+                "name": "overtrue",
+                "email": "anzhengchao@gmail.com"
             }
         ],
-        "description": "PSR HTTP message bridge",
-        "homepage": "http://symfony.com",
+        "description": "A collection of OAuth 2 packages that extracts from laravel/socialite.",
         "keywords": [
-            "http",
-            "http-message",
-            "psr-17",
-            "psr-7"
+            "login",
+            "oauth",
+            "qq",
+            "social",
+            "wechat",
+            "weibo"
         ]
     },
     {
-        "name": "psr/container",
-        "version": "1.0.0",
-        "version_normalized": "1.0.0.0",
+        "name": "overtrue/wechat",
+        "version": "4.2.8",
+        "version_normalized": "4.2.8.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/php-fig/container.git",
-            "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+            "url": "https://github.com/overtrue/wechat.git",
+            "reference": "d8d68636d02d1c51d0edd7aaa854813f6747bf8d"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
-            "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
+            "url": "https://api.github.com/repos/overtrue/wechat/zipball/d8d68636d02d1c51d0edd7aaa854813f6747bf8d",
+            "reference": "d8d68636d02d1c51d0edd7aaa854813f6747bf8d",
+            "shasum": ""
+        },
+        "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"
+        },
+        "time": "2019-11-08T10:32:21+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "EasyWeChat\\": "src/"
+            },
+            "files": [
+                "src/Kernel/Support/Helpers.php",
+                "src/Kernel/Helpers.php"
             ]
         },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "overtrue",
+                "email": "anzhengchao@gmail.com"
+            }
+        ],
+        "description": "微信SDK",
+        "keywords": [
+            "sdk",
+            "wechat",
+            "weixin",
+            "weixin-sdk"
+        ]
+    },
+    {
+        "name": "phpmailer/phpmailer",
+        "version": "v5.2.27",
+        "version_normalized": "5.2.27.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/PHPMailer/PHPMailer.git",
+            "reference": "dde1db116511aa4956389d75546c5be4c2beb2a6"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/dde1db116511aa4956389d75546c5be4c2beb2a6",
+            "reference": "dde1db116511aa4956389d75546c5be4c2beb2a6",
+            "shasum": ""
+        },
         "require": {
-            "php": ">=5.3.0"
+            "ext-ctype": "*",
+            "php": ">=5.0.0"
+        },
+        "require-dev": {
+            "doctrine/annotations": "1.2.*",
+            "jms/serializer": "0.16.*",
+            "phpdocumentor/phpdocumentor": "2.*",
+            "phpunit/phpunit": "4.8.*",
+            "symfony/debug": "2.8.*",
+            "symfony/filesystem": "2.8.*",
+            "symfony/translation": "2.8.*",
+            "symfony/yaml": "2.8.*",
+            "zendframework/zend-cache": "2.5.1",
+            "zendframework/zend-config": "2.5.1",
+            "zendframework/zend-eventmanager": "2.5.1",
+            "zendframework/zend-filter": "2.5.1",
+            "zendframework/zend-i18n": "2.5.1",
+            "zendframework/zend-json": "2.5.1",
+            "zendframework/zend-math": "2.5.1",
+            "zendframework/zend-serializer": "2.5.*",
+            "zendframework/zend-servicemanager": "2.5.*",
+            "zendframework/zend-stdlib": "2.5.1"
+        },
+        "suggest": {
+            "league/oauth2-google": "Needed for Google XOAUTH2 authentication"
         },
-        "time": "2017-02-14 16:28:37",
+        "time": "2018-11-15T22:32:31+00:00",
         "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.0.x-dev"
+        "installation-source": "dist",
+        "autoload": {
+            "classmap": [
+                "class.phpmailer.php",
+                "class.phpmaileroauth.php",
+                "class.phpmaileroauthgoogle.php",
+                "class.smtp.php",
+                "class.pop3.php",
+                "extras/EasyPeasyICS.php",
+                "extras/ntlm_sasl_client.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "LGPL-2.1"
+        ],
+        "authors": [
+            {
+                "name": "Jim Jagielski",
+                "email": "jimjag@gmail.com"
+            },
+            {
+                "name": "Marcus Bointon",
+                "email": "phpmailer@synchromedia.co.uk"
+            },
+            {
+                "name": "Andy Prevost",
+                "email": "codeworxtech@users.sourceforge.net"
+            },
+            {
+                "name": "Brent R. Matzelle"
             }
+        ],
+        "description": "PHPMailer is a full-featured email creation and transfer class for PHP"
+    },
+    {
+        "name": "phpoffice/phpspreadsheet",
+        "version": "1.8.1",
+        "version_normalized": "1.8.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
+            "reference": "352c7002fefe4e4037d02654d853a1b09520946f"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/352c7002fefe4e4037d02654d853a1b09520946f",
+            "reference": "352c7002fefe4e4037d02654d853a1b09520946f",
+            "shasum": ""
+        },
+        "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.1",
+            "php": "^5.6|^7.0",
+            "psr/simple-cache": "^1.0"
+        },
+        "require-dev": {
+            "doctrine/instantiator": "^1.0.0",
+            "dompdf/dompdf": "^0.8.0",
+            "friendsofphp/php-cs-fixer": "@stable",
+            "jpgraph/jpgraph": "^4.0",
+            "mpdf/mpdf": "^7.0.0",
+            "phpcompatibility/php-compatibility": "^8.0",
+            "phpunit/phpunit": "^5.7",
+            "squizlabs/php_codesniffer": "^3.3",
+            "tecnickcom/tcpdf": "^6.2"
+        },
+        "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"
         },
+        "time": "2019-07-01T20:46:51+00:00",
+        "type": "library",
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Psr\\Container\\": "src/"
+                "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
             }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "MIT"
+            "LGPL-2.1-or-later"
         ],
         "authors": [
             {
-                "name": "PHP-FIG",
-                "homepage": "http://www.php-fig.org/"
+                "name": "Erik Tilt"
+            },
+            {
+                "name": "Adrien Crivelli"
+            },
+            {
+                "name": "Maarten Balliauw",
+                "homepage": "https://blog.maartenballiauw.be"
+            },
+            {
+                "name": "Mark Baker",
+                "homepage": "https://markbakeruk.net"
+            },
+            {
+                "name": "Franck Lefevre",
+                "homepage": "https://rootslabs.net"
             }
         ],
-        "description": "Common Container Interface (PHP FIG PSR-11)",
-        "homepage": "https://github.com/php-fig/container",
+        "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+        "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
         "keywords": [
-            "PSR-11",
-            "container",
-            "container-interface",
-            "container-interop",
-            "psr"
+            "OpenXML",
+            "excel",
+            "gnumeric",
+            "ods",
+            "php",
+            "spreadsheet",
+            "xls",
+            "xlsx"
         ]
     },
     {
@@ -712,13 +1010,7 @@
             "type": "zip",
             "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32",
             "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "shasum": ""
         },
         "require": {
             "php": ">=5.3.0",
@@ -727,7 +1019,7 @@
         "require-dev": {
             "symfony/phpunit-bridge": "^3.2"
         },
-        "time": "2018-01-21 07:42:36",
+        "time": "2018-01-21T07:42:36+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -758,53 +1050,34 @@
         ]
     },
     {
-        "name": "guzzlehttp/guzzle",
-        "version": "6.3.3",
-        "version_normalized": "6.3.3.0",
+        "name": "psr/cache",
+        "version": "1.0.1",
+        "version_normalized": "1.0.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/guzzle/guzzle.git",
-            "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba"
+            "url": "https://github.com/php-fig/cache.git",
+            "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba",
-            "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
+            "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+            "shasum": ""
         },
         "require": {
-            "guzzlehttp/promises": "^1.0",
-            "guzzlehttp/psr7": "^1.4",
-            "php": ">=5.5"
-        },
-        "require-dev": {
-            "ext-curl": "*",
-            "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
-            "psr/log": "^1.0"
-        },
-        "suggest": {
-            "psr/log": "Required for using the Log middleware"
+            "php": ">=5.3.0"
         },
-        "time": "2018-04-22 15:46:56",
+        "time": "2016-08-06T20:24:11+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "6.3-dev"
+                "dev-master": "1.0.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "files": [
-                "src/functions_include.php"
-            ],
             "psr-4": {
-                "GuzzleHttp\\": "src/"
+                "Psr\\Cache\\": "src/"
             }
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -813,59 +1086,46 @@
         ],
         "authors": [
             {
-                "name": "Michael Dowling",
-                "email": "mtdowling@gmail.com",
-                "homepage": "https://github.com/mtdowling"
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/"
             }
         ],
-        "description": "Guzzle is a PHP HTTP client library",
-        "homepage": "http://guzzlephp.org/",
+        "description": "Common interface for caching libraries",
         "keywords": [
-            "client",
-            "curl",
-            "framework",
-            "http",
-            "http client",
-            "rest",
-            "web service"
+            "cache",
+            "psr",
+            "psr-6"
         ]
     },
     {
-        "name": "overtrue/socialite",
-        "version": "1.3.0",
-        "version_normalized": "1.3.0.0",
+        "name": "psr/container",
+        "version": "1.0.0",
+        "version_normalized": "1.0.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/overtrue/socialite.git",
-            "reference": "fda55f0acef43a144799b1957a8f93d9f5deffce"
+            "url": "https://github.com/php-fig/container.git",
+            "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/overtrue/socialite/zipball/fda55f0acef43a144799b1957a8f93d9f5deffce",
-            "reference": "fda55f0acef43a144799b1957a8f93d9f5deffce",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+            "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+            "shasum": ""
         },
         "require": {
-            "guzzlehttp/guzzle": "~5.0|~6.0",
-            "php": ">=5.4.0",
-            "symfony/http-foundation": "~2.6|~2.7|~2.8|~3.0"
-        },
-        "require-dev": {
-            "mockery/mockery": "~0.9",
-            "phpunit/phpunit": "~4.0"
+            "php": ">=5.3.0"
         },
-        "time": "2017-08-04 06:28:22",
+        "time": "2017-02-14T16:28:37+00:00",
         "type": "library",
-        "installation-source": "dist",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0.x-dev"
+            }
+        },
+        "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Overtrue\\Socialite\\": "src/"
+                "Psr\\Container\\": "src/"
             }
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -874,45 +1134,39 @@
         ],
         "authors": [
             {
-                "name": "overtrue",
-                "email": "anzhengchao@gmail.com"
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/"
             }
         ],
-        "description": "A collection of OAuth 2 packages that extracts from laravel/socialite.",
+        "description": "Common Container Interface (PHP FIG PSR-11)",
+        "homepage": "https://github.com/php-fig/container",
         "keywords": [
-            "login",
-            "oauth",
-            "qq",
-            "social",
-            "wechat",
-            "weibo"
+            "PSR-11",
+            "container",
+            "container-interface",
+            "container-interop",
+            "psr"
         ]
     },
     {
-        "name": "psr/log",
-        "version": "1.1.0",
-        "version_normalized": "1.1.0.0",
+        "name": "psr/http-message",
+        "version": "1.0.1",
+        "version_normalized": "1.0.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/php-fig/log.git",
-            "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"
+            "url": "https://github.com/php-fig/http-message.git",
+            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
-            "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+            "shasum": ""
         },
         "require": {
             "php": ">=5.3.0"
         },
-        "time": "2018-11-20 15:27:04",
+        "time": "2016-08-06T14:39:51+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -922,7 +1176,7 @@
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Psr\\Log\\": "Psr/Log/"
+                "Psr\\Http\\Message\\": "src/"
             }
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -935,79 +1189,46 @@
                 "homepage": "http://www.php-fig.org/"
             }
         ],
-        "description": "Common interface for logging libraries",
-        "homepage": "https://github.com/php-fig/log",
+        "description": "Common interface for HTTP messages",
+        "homepage": "https://github.com/php-fig/http-message",
         "keywords": [
-            "log",
+            "http",
+            "http-message",
             "psr",
-            "psr-3"
+            "psr-7",
+            "request",
+            "response"
         ]
     },
     {
-        "name": "monolog/monolog",
-        "version": "1.24.0",
-        "version_normalized": "1.24.0.0",
+        "name": "psr/log",
+        "version": "1.1.2",
+        "version_normalized": "1.1.2.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/Seldaek/monolog.git",
-            "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266"
+            "url": "https://github.com/php-fig/log.git",
+            "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266",
-            "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
+            "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
+            "shasum": ""
         },
         "require": {
-            "php": ">=5.3.0",
-            "psr/log": "~1.0"
-        },
-        "provide": {
-            "psr/log-implementation": "1.0.0"
-        },
-        "require-dev": {
-            "aws/aws-sdk-php": "^2.4.9 || ^3.0",
-            "doctrine/couchdb": "~1.0@dev",
-            "graylog2/gelf-php": "~1.0",
-            "jakub-onderka/php-parallel-lint": "0.9",
-            "php-amqplib/php-amqplib": "~2.4",
-            "php-console/php-console": "^3.1.3",
-            "phpunit/phpunit": "~4.5",
-            "phpunit/phpunit-mock-objects": "2.3.0",
-            "ruflin/elastica": ">=0.90 <3.0",
-            "sentry/sentry": "^0.13",
-            "swiftmailer/swiftmailer": "^5.3|^6.0"
-        },
-        "suggest": {
-            "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
-            "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
-            "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
-            "ext-mongo": "Allow sending log messages to a MongoDB server",
-            "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
-            "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
-            "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
-            "php-console/php-console": "Allow sending log messages to Google Chrome",
-            "rollbar/rollbar": "Allow sending log messages to Rollbar",
-            "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
-            "sentry/sentry": "Allow sending log messages to a Sentry server"
+            "php": ">=5.3.0"
         },
-        "time": "2018-11-05 09:00:11",
+        "time": "2019-11-01T11:05:21+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.0.x-dev"
+                "dev-master": "1.1.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Monolog\\": "src/Monolog"
+                "Psr\\Log\\": "Psr/Log/"
             }
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -1016,62 +1237,47 @@
         ],
         "authors": [
             {
-                "name": "Jordi Boggiano",
-                "email": "j.boggiano@seld.be",
-                "homepage": "http://seld.be"
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/"
             }
         ],
-        "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
-        "homepage": "http://github.com/Seldaek/monolog",
+        "description": "Common interface for logging libraries",
+        "homepage": "https://github.com/php-fig/log",
         "keywords": [
             "log",
-            "logging",
+            "psr",
             "psr-3"
         ]
     },
     {
-        "name": "doctrine/cache",
-        "version": "v1.4.4",
-        "version_normalized": "1.4.4.0",
+        "name": "psr/simple-cache",
+        "version": "1.0.1",
+        "version_normalized": "1.0.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/doctrine/cache.git",
-            "reference": "6433826dd02c9e5be8a127320dc13e7e6625d020"
+            "url": "https://github.com/php-fig/simple-cache.git",
+            "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/doctrine/cache/zipball/6433826dd02c9e5be8a127320dc13e7e6625d020",
-            "reference": "6433826dd02c9e5be8a127320dc13e7e6625d020",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+            "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+            "shasum": ""
         },
         "require": {
-            "php": ">=5.3.2"
-        },
-        "conflict": {
-            "doctrine/common": ">2.2,<2.4"
-        },
-        "require-dev": {
-            "phpunit/phpunit": ">=3.7",
-            "predis/predis": "~1.0",
-            "satooshi/php-coveralls": "~0.6"
+            "php": ">=5.3.0"
         },
-        "time": "2015-11-02 18:33:51",
+        "time": "2017-10-23T01:57:42+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.5.x-dev"
+                "dev-master": "1.0.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "Doctrine\\Common\\Cache\\": "lib/"
+            "psr-4": {
+                "Psr\\SimpleCache\\": "src/"
             }
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -1080,79 +1286,47 @@
         ],
         "authors": [
             {
-                "name": "Roman Borschel",
-                "email": "roman@code-factory.org"
-            },
-            {
-                "name": "Benjamin Eberlei",
-                "email": "kontakt@beberlei.de"
-            },
-            {
-                "name": "Guilherme Blanco",
-                "email": "guilhermeblanco@gmail.com"
-            },
-            {
-                "name": "Jonathan Wage",
-                "email": "jonwage@gmail.com"
-            },
-            {
-                "name": "Johannes Schmitt",
-                "email": "schmittjoh@gmail.com"
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/"
             }
         ],
-        "description": "Caching library offering an object-oriented API for many cache backends",
-        "homepage": "http://www.doctrine-project.org",
+        "description": "Common interfaces for simple caching",
         "keywords": [
             "cache",
-            "caching"
+            "caching",
+            "psr",
+            "psr-16",
+            "simple-cache"
         ]
     },
     {
-        "name": "overtrue/wechat",
-        "version": "3.3.33",
-        "version_normalized": "3.3.33.0",
+        "name": "ralouphie/getallheaders",
+        "version": "3.0.3",
+        "version_normalized": "3.0.3.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/overtrue/wechat.git",
-            "reference": "78e5476df330754040d1c400d0bca640d5b77cb7"
+            "url": "https://github.com/ralouphie/getallheaders.git",
+            "reference": "120b605dfeb996808c31b6477290a714d356e822"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/overtrue/wechat/zipball/78e5476df330754040d1c400d0bca640d5b77cb7",
-            "reference": "78e5476df330754040d1c400d0bca640d5b77cb7",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+            "reference": "120b605dfeb996808c31b6477290a714d356e822",
+            "shasum": ""
         },
         "require": {
-            "doctrine/cache": "1.4.*",
-            "ext-openssl": "*",
-            "guzzlehttp/guzzle": "~6.2",
-            "monolog/monolog": "^1.17",
-            "overtrue/socialite": "^1.0.25",
-            "php": ">=5.5.0",
-            "pimple/pimple": "~3.0",
-            "symfony/http-foundation": "~2.6|~2.7|~2.8|~3.0",
-            "symfony/psr-http-message-bridge": "~0.3|^1.0"
+            "php": ">=5.6"
         },
         "require-dev": {
-            "mockery/mockery": "^0.9.9",
-            "overtrue/phplint": "dev-master",
-            "phpunit/phpunit": "~4.0"
+            "php-coveralls/php-coveralls": "^2.1",
+            "phpunit/phpunit": "^5 || ^6.5"
         },
-        "time": "2018-10-17 12:27:27",
+        "time": "2019-03-08T08:55:37+00:00",
         "type": "library",
         "installation-source": "dist",
         "autoload": {
-            "psr-4": {
-                "EasyWeChat\\": "src/"
-            },
             "files": [
-                "src/Payment/helpers.php"
+                "src/getallheaders.php"
             ]
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -1161,138 +1335,125 @@
         ],
         "authors": [
             {
-                "name": "overtrue",
-                "email": "anzhengchao@gmail.com"
+                "name": "Ralph Khattar",
+                "email": "ralph.khattar@gmail.com"
             }
         ],
-        "description": "微信SDK",
-        "keywords": [
-            "sdk",
-            "wechat",
-            "weixin",
-            "weixin-sdk"
-        ]
+        "description": "A polyfill for getallheaders."
     },
     {
-        "name": "phpmailer/phpmailer",
-        "version": "v5.2.27",
-        "version_normalized": "5.2.27.0",
+        "name": "symfony/cache",
+        "version": "v4.3.8",
+        "version_normalized": "4.3.8.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/PHPMailer/PHPMailer.git",
-            "reference": "dde1db116511aa4956389d75546c5be4c2beb2a6"
+            "url": "https://github.com/symfony/cache.git",
+            "reference": "83dca34362a0aba2b93aa1226dac6ef7cfea1262"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/dde1db116511aa4956389d75546c5be4c2beb2a6",
-            "reference": "dde1db116511aa4956389d75546c5be4c2beb2a6",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/symfony/cache/zipball/83dca34362a0aba2b93aa1226dac6ef7cfea1262",
+            "reference": "83dca34362a0aba2b93aa1226dac6ef7cfea1262",
+            "shasum": ""
         },
         "require": {
-            "ext-ctype": "*",
-            "php": ">=5.0.0"
+            "php": "^7.1.3",
+            "psr/cache": "~1.0",
+            "psr/log": "~1.0",
+            "symfony/cache-contracts": "^1.1",
+            "symfony/service-contracts": "^1.1",
+            "symfony/var-exporter": "^4.2"
         },
-        "require-dev": {
-            "doctrine/annotations": "1.2.*",
-            "jms/serializer": "0.16.*",
-            "phpdocumentor/phpdocumentor": "2.*",
-            "phpunit/phpunit": "4.8.*",
-            "symfony/debug": "2.8.*",
-            "symfony/filesystem": "2.8.*",
-            "symfony/translation": "2.8.*",
-            "symfony/yaml": "2.8.*",
-            "zendframework/zend-cache": "2.5.1",
-            "zendframework/zend-config": "2.5.1",
-            "zendframework/zend-eventmanager": "2.5.1",
-            "zendframework/zend-filter": "2.5.1",
-            "zendframework/zend-i18n": "2.5.1",
-            "zendframework/zend-json": "2.5.1",
-            "zendframework/zend-math": "2.5.1",
-            "zendframework/zend-serializer": "2.5.*",
-            "zendframework/zend-servicemanager": "2.5.*",
-            "zendframework/zend-stdlib": "2.5.1"
+        "conflict": {
+            "doctrine/dbal": "<2.5",
+            "symfony/dependency-injection": "<3.4",
+            "symfony/var-dumper": "<3.4"
         },
-        "suggest": {
-            "league/oauth2-google": "Needed for Google XOAUTH2 authentication"
+        "provide": {
+            "psr/cache-implementation": "1.0",
+            "psr/simple-cache-implementation": "1.0",
+            "symfony/cache-implementation": "1.0"
         },
-        "time": "2018-11-15 22:32:31",
+        "require-dev": {
+            "cache/integration-tests": "dev-master",
+            "doctrine/cache": "~1.6",
+            "doctrine/dbal": "~2.5",
+            "predis/predis": "~1.1",
+            "psr/simple-cache": "^1.0",
+            "symfony/config": "~4.2",
+            "symfony/dependency-injection": "~3.4|~4.1",
+            "symfony/var-dumper": "^4.1.1"
+        },
+        "time": "2019-11-12T13:07:20+00:00",
         "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "4.3-dev"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
-            "classmap": [
-                "class.phpmailer.php",
-                "class.phpmaileroauth.php",
-                "class.phpmaileroauthgoogle.php",
-                "class.smtp.php",
-                "class.pop3.php",
-                "extras/EasyPeasyICS.php",
-                "extras/ntlm_sasl_client.php"
+            "psr-4": {
+                "Symfony\\Component\\Cache\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
             ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "LGPL-2.1"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "Jim Jagielski",
-                "email": "jimjag@gmail.com"
-            },
-            {
-                "name": "Marcus Bointon",
-                "email": "phpmailer@synchromedia.co.uk"
-            },
-            {
-                "name": "Andy Prevost",
-                "email": "codeworxtech@users.sourceforge.net"
+                "name": "Nicolas Grekas",
+                "email": "p@tchwork.com"
             },
             {
-                "name": "Brent R. Matzelle"
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "PHPMailer is a full-featured email creation and transfer class for PHP"
+        "description": "Symfony Cache component with PSR-6, PSR-16, and tags",
+        "homepage": "https://symfony.com",
+        "keywords": [
+            "caching",
+            "psr6"
+        ]
     },
     {
-        "name": "psr/simple-cache",
-        "version": "1.0.1",
-        "version_normalized": "1.0.1.0",
+        "name": "symfony/cache-contracts",
+        "version": "v1.1.7",
+        "version_normalized": "1.1.7.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/php-fig/simple-cache.git",
-            "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+            "url": "https://github.com/symfony/cache-contracts.git",
+            "reference": "af50d14ada9e4e82cfabfabdc502d144f89be0a1"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
-            "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/af50d14ada9e4e82cfabfabdc502d144f89be0a1",
+            "reference": "af50d14ada9e4e82cfabfabdc502d144f89be0a1",
+            "shasum": ""
         },
         "require": {
-            "php": ">=5.3.0"
+            "php": "^7.1.3",
+            "psr/cache": "^1.0"
+        },
+        "suggest": {
+            "symfony/cache-implementation": ""
         },
-        "time": "2017-10-23 01:57:42",
+        "time": "2019-10-04T21:43:27+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.0.x-dev"
+                "dev-master": "1.1-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Psr\\SimpleCache\\": "src/"
+                "Symfony\\Contracts\\Cache\\": ""
             }
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -1301,77 +1462,78 @@
         ],
         "authors": [
             {
-                "name": "PHP-FIG",
-                "homepage": "http://www.php-fig.org/"
+                "name": "Nicolas Grekas",
+                "email": "p@tchwork.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "Common interfaces for simple caching",
+        "description": "Generic abstractions related to caching",
+        "homepage": "https://symfony.com",
         "keywords": [
-            "cache",
-            "caching",
-            "psr",
-            "psr-16",
-            "simple-cache"
+            "abstractions",
+            "contracts",
+            "decoupling",
+            "interfaces",
+            "interoperability",
+            "standards"
         ]
     },
     {
-        "name": "markbaker/matrix",
-        "version": "1.1.4",
-        "version_normalized": "1.1.4.0",
+        "name": "symfony/event-dispatcher",
+        "version": "v4.3.8",
+        "version_normalized": "4.3.8.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/MarkBaker/PHPMatrix.git",
-            "reference": "6ea97472b5baf12119b4f31f802835b820dd6d64"
+            "url": "https://github.com/symfony/event-dispatcher.git",
+            "reference": "0df002fd4f500392eabd243c2947061a50937287"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/6ea97472b5baf12119b4f31f802835b820dd6d64",
-            "reference": "6ea97472b5baf12119b4f31f802835b820dd6d64",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0df002fd4f500392eabd243c2947061a50937287",
+            "reference": "0df002fd4f500392eabd243c2947061a50937287",
+            "shasum": ""
         },
         "require": {
-            "php": "^5.6.0|^7.0.0"
+            "php": "^7.1.3",
+            "symfony/event-dispatcher-contracts": "^1.1"
+        },
+        "conflict": {
+            "symfony/dependency-injection": "<3.4"
+        },
+        "provide": {
+            "psr/event-dispatcher-implementation": "1.0",
+            "symfony/event-dispatcher-implementation": "1.1"
         },
         "require-dev": {
-            "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3",
-            "phpcompatibility/php-compatibility": "^8.0",
-            "phpdocumentor/phpdocumentor": "2.*",
-            "phploc/phploc": "2.*",
-            "phpmd/phpmd": "2.*",
-            "phpunit/phpunit": "^4.8.35|^5.4.0",
-            "sebastian/phpcpd": "2.*",
-            "squizlabs/php_codesniffer": "^3.3.0"
+            "psr/log": "~1.0",
+            "symfony/config": "~3.4|~4.0",
+            "symfony/dependency-injection": "~3.4|~4.0",
+            "symfony/expression-language": "~3.4|~4.0",
+            "symfony/http-foundation": "^3.4|^4.0",
+            "symfony/service-contracts": "^1.1",
+            "symfony/stopwatch": "~3.4|~4.0"
+        },
+        "suggest": {
+            "symfony/dependency-injection": "",
+            "symfony/http-kernel": ""
         },
-        "time": "2018-11-04 22:12:12",
+        "time": "2019-11-03T09:04:05+00:00",
         "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "4.3-dev"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Matrix\\": "classes/src/"
+                "Symfony\\Component\\EventDispatcher\\": ""
             },
-            "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"
+            "exclude-from-classmap": [
+                "/Tests/"
             ]
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -1380,102 +1542,172 @@
         ],
         "authors": [
             {
-                "name": "Mark Baker",
-                "email": "mark@lange.demon.co.uk"
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "PHP Class for working with matrices",
-        "homepage": "https://github.com/MarkBaker/PHPMatrix",
+        "description": "Symfony EventDispatcher Component",
+        "homepage": "https://symfony.com"
+    },
+    {
+        "name": "symfony/event-dispatcher-contracts",
+        "version": "v1.1.7",
+        "version_normalized": "1.1.7.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+            "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c43ab685673fb6c8d84220c77897b1d6cdbe1d18",
+            "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18",
+            "shasum": ""
+        },
+        "require": {
+            "php": "^7.1.3"
+        },
+        "suggest": {
+            "psr/event-dispatcher": "",
+            "symfony/event-dispatcher-implementation": ""
+        },
+        "time": "2019-09-17T09:54:03+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.1-dev"
+            }
+        },
+        "installation-source": "dist",
+        "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": [
-            "mathematics",
-            "matrix",
-            "vector"
+            "abstractions",
+            "contracts",
+            "decoupling",
+            "interfaces",
+            "interoperability",
+            "standards"
         ]
     },
     {
-        "name": "markbaker/complex",
-        "version": "1.4.7",
-        "version_normalized": "1.4.7.0",
+        "name": "symfony/http-foundation",
+        "version": "v4.3.8",
+        "version_normalized": "4.3.8.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/MarkBaker/PHPComplex.git",
-            "reference": "1ea674a8308baf547cbcbd30c5fcd6d301b7c000"
+            "url": "https://github.com/symfony/http-foundation.git",
+            "reference": "cabe67275034e173350e158f3b1803d023880227"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/1ea674a8308baf547cbcbd30c5fcd6d301b7c000",
-            "reference": "1ea674a8308baf547cbcbd30c5fcd6d301b7c000",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
+            "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cabe67275034e173350e158f3b1803d023880227",
+            "reference": "cabe67275034e173350e158f3b1803d023880227",
+            "shasum": ""
+        },
+        "require": {
+            "php": "^7.1.3",
+            "symfony/mime": "^4.3",
+            "symfony/polyfill-mbstring": "~1.1"
+        },
+        "require-dev": {
+            "predis/predis": "~1.0",
+            "symfony/expression-language": "~3.4|~4.0"
+        },
+        "time": "2019-11-12T13:07:20+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "4.3-dev"
+            }
+        },
+        "installation-source": "dist",
+        "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": "Symfony HttpFoundation Component",
+        "homepage": "https://symfony.com"
+    },
+    {
+        "name": "symfony/mime",
+        "version": "v4.3.8",
+        "version_normalized": "4.3.8.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/mime.git",
+            "reference": "22aecf6b11638ef378fab25d6c5a2da8a31a1448"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/mime/zipball/22aecf6b11638ef378fab25d6c5a2da8a31a1448",
+            "reference": "22aecf6b11638ef378fab25d6c5a2da8a31a1448",
+            "shasum": ""
+        },
         "require": {
-            "php": "^5.6.0|^7.0.0"
+            "php": "^7.1.3",
+            "symfony/polyfill-intl-idn": "^1.10",
+            "symfony/polyfill-mbstring": "^1.0"
         },
         "require-dev": {
-            "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3",
-            "phpcompatibility/php-compatibility": "^8.0",
-            "phpdocumentor/phpdocumentor": "2.*",
-            "phploc/phploc": "2.*",
-            "phpmd/phpmd": "2.*",
-            "phpunit/phpunit": "^4.8.35|^5.4.0",
-            "sebastian/phpcpd": "2.*",
-            "squizlabs/php_codesniffer": "^3.3.0"
+            "egulias/email-validator": "^2.1.10",
+            "symfony/dependency-injection": "~3.4|^4.1"
         },
-        "time": "2018-10-13 23:28:42",
+        "time": "2019-11-12T13:10:02+00:00",
         "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "4.3-dev"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Complex\\": "classes/src/"
+                "Symfony\\Component\\Mime\\": ""
             },
-            "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"
+            "exclude-from-classmap": [
+                "/Tests/"
             ]
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -1484,320 +1716,418 @@
         ],
         "authors": [
             {
-                "name": "Mark Baker",
-                "email": "mark@lange.demon.co.uk"
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "PHP Class for working with complex numbers",
-        "homepage": "https://github.com/MarkBaker/PHPComplex",
+        "description": "A library to manipulate MIME messages",
+        "homepage": "https://symfony.com",
         "keywords": [
-            "complex",
-            "mathematics"
+            "mime",
+            "mime-type"
         ]
     },
     {
-        "name": "topthink/framework",
-        "version": "v5.0.24",
-        "version_normalized": "5.0.24.0",
+        "name": "symfony/options-resolver",
+        "version": "v3.4.29",
+        "version_normalized": "3.4.29.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/top-think/framework.git",
-            "reference": "c255c22b2f5fa30f320ecf6c1d29f7740eb3e8be"
+            "url": "https://github.com/symfony/options-resolver.git",
+            "reference": "ed3b397f9c07c8ca388b2a1ef744403b4d4ecc44"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/top-think/framework/zipball/c255c22b2f5fa30f320ecf6c1d29f7740eb3e8be",
-            "reference": "c255c22b2f5fa30f320ecf6c1d29f7740eb3e8be",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/symfony/options-resolver/zipball/ed3b397f9c07c8ca388b2a1ef744403b4d4ecc44",
+            "reference": "ed3b397f9c07c8ca388b2a1ef744403b4d4ecc44",
+            "shasum": ""
         },
         "require": {
-            "php": ">=5.4.0",
-            "topthink/think-installer": "~1.0"
+            "php": "^5.5.9|>=7.0.8"
         },
-        "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.*"
+        "time": "2019-04-10T16:00:48+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.4-dev"
+            }
         },
-        "time": "2019-01-11 08:04:58",
-        "type": "think-framework",
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "think\\": "library/think"
-            }
+                "Symfony\\Component\\OptionsResolver\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "Apache-2.0"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "liu21st",
-                "email": "liu21st@gmail.com"
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "the new thinkphp framework",
-        "homepage": "http://thinkphp.cn/",
+        "description": "Symfony OptionsResolver Component",
+        "homepage": "https://symfony.com",
         "keywords": [
-            "framework",
-            "orm",
-            "thinkphp"
+            "config",
+            "configuration",
+            "options"
         ]
     },
     {
-        "name": "topthink/think-captcha",
-        "version": "v1.0.8",
-        "version_normalized": "1.0.8.0",
+        "name": "symfony/polyfill-intl-idn",
+        "version": "v1.12.0",
+        "version_normalized": "1.12.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/top-think/think-captcha.git",
-            "reference": "1d64363c814c92f6086c4fa5e3223fe7e23db09d"
+            "url": "https://github.com/symfony/polyfill-intl-idn.git",
+            "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-captcha/zipball/1d64363c814c92f6086c4fa5e3223fe7e23db09d",
-            "reference": "1d64363c814c92f6086c4fa5e3223fe7e23db09d",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6af626ae6fa37d396dc90a399c0ff08e5cfc45b2",
+            "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2",
+            "shasum": ""
         },
         "require": {
-            "topthink/framework": "~5.0.0",
-            "topthink/think-installer": ">=1.0.10"
+            "php": ">=5.3.3",
+            "symfony/polyfill-mbstring": "^1.3",
+            "symfony/polyfill-php72": "^1.9"
         },
-        "time": "2019-01-28 04:48:36",
+        "suggest": {
+            "ext-intl": "For best performance"
+        },
+        "time": "2019-08-06T08:03:45+00:00",
         "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.12-dev"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "think\\captcha\\": "src/"
+                "Symfony\\Polyfill\\Intl\\Idn\\": ""
             },
             "files": [
-                "src/helper.php"
+                "bootstrap.php"
             ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "Apache-2.0"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "yunwuxin",
-                "email": "448901948@qq.com"
+                "name": "Laurent Bassin",
+                "email": "laurent@bassin.info"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "captcha package for thinkphp5"
+        "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"
+        ]
     },
     {
-        "name": "karsonzhang/fastadmin-addons",
-        "version": "1.1.9",
-        "version_normalized": "1.1.9.0",
+        "name": "symfony/polyfill-mbstring",
+        "version": "v1.12.0",
+        "version_normalized": "1.12.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/karsonzhang/fastadmin-addons.git",
-            "reference": "c539b1c4aa99ea8c453cbd3a838f523136bc118a"
+            "url": "https://github.com/symfony/polyfill-mbstring.git",
+            "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/karsonzhang/fastadmin-addons/zipball/c539b1c4aa99ea8c453cbd3a838f523136bc118a",
-            "reference": "c539b1c4aa99ea8c453cbd3a838f523136bc118a",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://dl.laravel-china.org/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b42a2f66e8f1b15ccf25652c3424265923eb4f17",
+            "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17",
+            "shasum": ""
         },
         "require": {
-            "php": ">=5.4.0",
-            "topthink/think-helper": ">=1.0.4",
-            "topthink/think-installer": ">=1.0.10"
+            "php": ">=5.3.3"
         },
-        "time": "2019-06-11 09:05:52",
+        "suggest": {
+            "ext-mbstring": "For best performance"
+        },
+        "time": "2019-08-06T08:03:45+00:00",
         "type": "library",
         "extra": {
-            "think-config": {
-                "addons": "src/config.php"
+            "branch-alias": {
+                "dev-master": "1.12-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "think\\": "src/"
+                "Symfony\\Polyfill\\Mbstring\\": ""
             },
             "files": [
-                "src/common.php"
+                "bootstrap.php"
             ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "Apache-2.0"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "xiaobo.sun",
-                "email": "xiaobo.sun@qq.com"
+                "name": "Nicolas Grekas",
+                "email": "p@tchwork.com"
             },
             {
-                "name": "karsonzhang",
-                "email": "karsonzhang@163.com"
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "addons package for fastadmin",
-        "homepage": "https://github.com/karsonzhang/fastadmin-addons"
+        "description": "Symfony polyfill for the Mbstring extension",
+        "homepage": "https://symfony.com",
+        "keywords": [
+            "compatibility",
+            "mbstring",
+            "polyfill",
+            "portable",
+            "shim"
+        ]
     },
     {
-        "name": "phpoffice/phpspreadsheet",
-        "version": "1.8.1",
-        "version_normalized": "1.8.1.0",
+        "name": "symfony/polyfill-php72",
+        "version": "v1.12.0",
+        "version_normalized": "1.12.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
-            "reference": "352c7002fefe4e4037d02654d853a1b09520946f"
+            "url": "https://github.com/symfony/polyfill-php72.git",
+            "reference": "04ce3335667451138df4307d6a9b61565560199e"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/352c7002fefe4e4037d02654d853a1b09520946f",
-            "reference": "352c7002fefe4e4037d02654d853a1b09520946f",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
-                }
+            "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/04ce3335667451138df4307d6a9b61565560199e",
+            "reference": "04ce3335667451138df4307d6a9b61565560199e",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "time": "2019-08-06T08:03:45+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.12-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Polyfill\\Php72\\": ""
+            },
+            "files": [
+                "bootstrap.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": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+        "homepage": "https://symfony.com",
+        "keywords": [
+            "compatibility",
+            "polyfill",
+            "portable",
+            "shim"
+        ]
+    },
+    {
+        "name": "symfony/psr-http-message-bridge",
+        "version": "v1.2.0",
+        "version_normalized": "1.2.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/psr-http-message-bridge.git",
+            "reference": "9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad",
+            "reference": "9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad",
+            "shasum": ""
+        },
         "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.1",
-            "php": "^5.6|^7.0",
-            "psr/simple-cache": "^1.0"
+            "php": "^7.1",
+            "psr/http-message": "^1.0",
+            "symfony/http-foundation": "^3.4 || ^4.0"
+        },
+        "require-dev": {
+            "nyholm/psr7": "^1.1",
+            "symfony/phpunit-bridge": "^3.4.20 || ^4.0",
+            "zendframework/zend-diactoros": "^1.4.1 || ^2.0"
+        },
+        "suggest": {
+            "nyholm/psr7": "For a super lightweight PSR-7/17 implementation"
+        },
+        "time": "2019-03-11T18:22:33+00:00",
+        "type": "symfony-bridge",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.2-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Bridge\\PsrHttpMessage\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Symfony Community",
+                "homepage": "http://symfony.com/contributors"
+            },
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            }
+        ],
+        "description": "PSR HTTP message bridge",
+        "homepage": "http://symfony.com",
+        "keywords": [
+            "http",
+            "http-message",
+            "psr-17",
+            "psr-7"
+        ]
+    },
+    {
+        "name": "symfony/service-contracts",
+        "version": "v1.1.8",
+        "version_normalized": "1.1.8.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/service-contracts.git",
+            "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ffc7f5692092df31515df2a5ecf3b7302b3ddacf",
+            "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf",
+            "shasum": ""
         },
-        "require-dev": {
-            "doctrine/instantiator": "^1.0.0",
-            "dompdf/dompdf": "^0.8.0",
-            "friendsofphp/php-cs-fixer": "@stable",
-            "jpgraph/jpgraph": "^4.0",
-            "mpdf/mpdf": "^7.0.0",
-            "phpcompatibility/php-compatibility": "^8.0",
-            "phpunit/phpunit": "^5.7",
-            "squizlabs/php_codesniffer": "^3.3",
-            "tecnickcom/tcpdf": "^6.2"
+        "require": {
+            "php": "^7.1.3",
+            "psr/container": "^1.0"
         },
         "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"
+            "symfony/service-implementation": ""
         },
-        "time": "2019-07-01 20:46:51",
+        "time": "2019-10-14T12:27:06+00:00",
         "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.1-dev"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
+                "Symfony\\Contracts\\Service\\": ""
             }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "LGPL-2.1-or-later"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "Erik Tilt"
-            },
-            {
-                "name": "Adrien Crivelli"
-            },
-            {
-                "name": "Maarten Balliauw",
-                "homepage": "https://blog.maartenballiauw.be"
-            },
-            {
-                "name": "Mark Baker",
-                "homepage": "https://markbakeruk.net"
+                "name": "Nicolas Grekas",
+                "email": "p@tchwork.com"
             },
             {
-                "name": "Franck Lefevre",
-                "homepage": "https://rootslabs.net"
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
-        "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
+        "description": "Generic abstractions related to writing services",
+        "homepage": "https://symfony.com",
         "keywords": [
-            "OpenXML",
-            "excel",
-            "gnumeric",
-            "ods",
-            "php",
-            "spreadsheet",
-            "xls",
-            "xlsx"
+            "abstractions",
+            "contracts",
+            "decoupling",
+            "interfaces",
+            "interoperability",
+            "standards"
         ]
     },
     {
-        "name": "symfony/options-resolver",
-        "version": "v3.4.29",
-        "version_normalized": "3.4.29.0",
+        "name": "symfony/var-exporter",
+        "version": "v4.3.8",
+        "version_normalized": "4.3.8.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/options-resolver.git",
-            "reference": "ed3b397f9c07c8ca388b2a1ef744403b4d4ecc44"
+            "url": "https://github.com/symfony/var-exporter.git",
+            "reference": "097aa4c02954dabe9d508229be86213723973ac0"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/options-resolver/zipball/ed3b397f9c07c8ca388b2a1ef744403b4d4ecc44",
-            "reference": "ed3b397f9c07c8ca388b2a1ef744403b4d4ecc44",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/symfony/var-exporter/zipball/097aa4c02954dabe9d508229be86213723973ac0",
+            "reference": "097aa4c02954dabe9d508229be86213723973ac0",
+            "shasum": ""
         },
         "require": {
-            "php": "^5.5.9|>=7.0.8"
+            "php": "^7.1.3"
+        },
+        "require-dev": {
+            "symfony/var-dumper": "^4.1.1"
         },
-        "time": "2019-04-10 16:00:48",
+        "time": "2019-11-11T12:48:54+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "3.4-dev"
+                "dev-master": "4.3-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Symfony\\Component\\OptionsResolver\\": ""
+                "Symfony\\Component\\VarExporter\\": ""
             },
             "exclude-from-classmap": [
                 "/Tests/"
@@ -1809,209 +2139,199 @@
         ],
         "authors": [
             {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
+                "name": "Nicolas Grekas",
+                "email": "p@tchwork.com"
             },
             {
                 "name": "Symfony Community",
                 "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "Symfony OptionsResolver Component",
+        "description": "A blend of var_export() + serialize() to turn any serializable data structure to plain PHP code",
         "homepage": "https://symfony.com",
         "keywords": [
-            "config",
-            "configuration",
-            "options"
+            "clone",
+            "construct",
+            "export",
+            "hydrate",
+            "instantiate",
+            "serialize"
         ]
     },
     {
-        "name": "symfony/http-foundation",
-        "version": "v3.4.29",
-        "version_normalized": "3.4.29.0",
+        "name": "topthink/framework",
+        "version": "v5.0.24",
+        "version_normalized": "5.0.24.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/http-foundation.git",
-            "reference": "8cfbf75bb3a72963b12c513a73e9247891df24f8"
+            "url": "https://github.com/top-think/framework.git",
+            "reference": "c255c22b2f5fa30f320ecf6c1d29f7740eb3e8be"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8cfbf75bb3a72963b12c513a73e9247891df24f8",
-            "reference": "8cfbf75bb3a72963b12c513a73e9247891df24f8",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/top-think/framework/zipball/c255c22b2f5fa30f320ecf6c1d29f7740eb3e8be",
+            "reference": "c255c22b2f5fa30f320ecf6c1d29f7740eb3e8be",
+            "shasum": ""
         },
         "require": {
-            "php": "^5.5.9|>=7.0.8",
-            "symfony/polyfill-mbstring": "~1.1",
-            "symfony/polyfill-php70": "~1.6"
+            "php": ">=5.4.0",
+            "topthink/think-installer": "~1.0"
         },
         "require-dev": {
-            "symfony/expression-language": "~2.8|~3.0|~4.0"
+            "johnkary/phpunit-speedtrap": "^1.0",
+            "mikey179/vfsstream": "~1.6",
+            "phpdocumentor/reflection-docblock": "^2.0",
+            "phploc/phploc": "2.*",
+            "phpunit/phpunit": "4.8.*",
+            "sebastian/phpcpd": "2.*"
         },
-        "time": "2019-06-22 20:10:25",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "3.4-dev"
+        "time": "2019-01-11T08:04:58+00:00",
+        "type": "think-framework",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "think\\": "library/think"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "Apache-2.0"
+        ],
+        "authors": [
+            {
+                "name": "liu21st",
+                "email": "liu21st@gmail.com"
             }
+        ],
+        "description": "the new thinkphp framework",
+        "homepage": "http://thinkphp.cn/",
+        "keywords": [
+            "framework",
+            "orm",
+            "thinkphp"
+        ]
+    },
+    {
+        "name": "topthink/think-captcha",
+        "version": "v1.0.8",
+        "version_normalized": "1.0.8.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/top-think/think-captcha.git",
+            "reference": "1d64363c814c92f6086c4fa5e3223fe7e23db09d"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/top-think/think-captcha/zipball/1d64363c814c92f6086c4fa5e3223fe7e23db09d",
+            "reference": "1d64363c814c92f6086c4fa5e3223fe7e23db09d",
+            "shasum": ""
+        },
+        "require": {
+            "topthink/framework": "~5.0.0",
+            "topthink/think-installer": ">=1.0.10"
         },
+        "time": "2019-01-28T04:48:36+00:00",
+        "type": "library",
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Symfony\\Component\\HttpFoundation\\": ""
+                "think\\captcha\\": "src/"
             },
-            "exclude-from-classmap": [
-                "/Tests/"
+            "files": [
+                "src/helper.php"
             ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "MIT"
+            "Apache-2.0"
         ],
         "authors": [
             {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
+                "name": "yunwuxin",
+                "email": "448901948@qq.com"
             }
         ],
-        "description": "Symfony HttpFoundation Component",
-        "homepage": "https://symfony.com"
+        "description": "captcha package for thinkphp5"
     },
     {
-        "name": "ralouphie/getallheaders",
-        "version": "3.0.3",
-        "version_normalized": "3.0.3.0",
+        "name": "topthink/think-helper",
+        "version": "v3.0.0",
+        "version_normalized": "3.0.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/ralouphie/getallheaders.git",
-            "reference": "120b605dfeb996808c31b6477290a714d356e822"
+            "url": "https://github.com/top-think/think-helper.git",
+            "reference": "8ba5f66e68106369fcc3211e7d2dbaf7bc9ce455"
         },
         "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"
+            "url": "https://api.github.com/repos/top-think/think-helper/zipball/8ba5f66e68106369fcc3211e7d2dbaf7bc9ce455",
+            "reference": "8ba5f66e68106369fcc3211e7d2dbaf7bc9ce455",
+            "shasum": ""
         },
-        "time": "2019-03-08 08:55:37",
+        "time": "2019-03-14T09:28:59+00:00",
         "type": "library",
         "installation-source": "dist",
         "autoload": {
+            "psr-4": {
+                "think\\helper\\": "src"
+            },
             "files": [
-                "src/getallheaders.php"
+                "src/helper.php"
             ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "MIT"
+            "Apache-2.0"
         ],
         "authors": [
             {
-                "name": "Ralph Khattar",
-                "email": "ralph.khattar@gmail.com"
+                "name": "yunwuxin",
+                "email": "448901948@qq.com"
             }
         ],
-        "description": "A polyfill for getallheaders."
+        "description": "The ThinkPHP5 Helper Package"
     },
     {
-        "name": "guzzlehttp/psr7",
-        "version": "1.6.1",
-        "version_normalized": "1.6.1.0",
+        "name": "topthink/think-installer",
+        "version": "v1.0.12",
+        "version_normalized": "1.0.12.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/guzzle/psr7.git",
-            "reference": "239400de7a173fe9901b9ac7c06497751f00727a"
+            "url": "https://github.com/top-think/think-installer.git",
+            "reference": "1be326e68f63de4e95977ed50f46ae75f017556d"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
-            "reference": "239400de7a173fe9901b9ac7c06497751f00727a",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
+            "url": "https://api.github.com/repos/top-think/think-installer/zipball/1be326e68f63de4e95977ed50f46ae75f017556d",
+            "reference": "1be326e68f63de4e95977ed50f46ae75f017556d",
+            "shasum": ""
         },
         "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"
+            "composer-plugin-api": "^1.0"
         },
         "require-dev": {
-            "ext-zlib": "*",
-            "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
-        },
-        "suggest": {
-            "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
+            "composer/composer": "1.0.*@dev"
         },
-        "time": "2019-07-01 23:21:34",
-        "type": "library",
+        "time": "2017-05-27T06:58:09+00:00",
+        "type": "composer-plugin",
         "extra": {
-            "branch-alias": {
-                "dev-master": "1.6-dev"
-            }
+            "class": "think\\composer\\Plugin"
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "GuzzleHttp\\Psr7\\": "src/"
-            },
-            "files": [
-                "src/functions_include.php"
-            ]
+                "think\\composer\\": "src"
+            }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "MIT"
+            "Apache-2.0"
         ],
         "authors": [
             {
-                "name": "Michael Dowling",
-                "email": "mtdowling@gmail.com",
-                "homepage": "https://github.com/mtdowling"
-            },
-            {
-                "name": "Tobias Schultze",
-                "homepage": "https://github.com/Tobion"
+                "name": "yunwuxin",
+                "email": "448901948@qq.com"
             }
-        ],
-        "description": "PSR-7 message implementation that also provides common utility methods",
-        "keywords": [
-            "http",
-            "message",
-            "psr-7",
-            "request",
-            "response",
-            "stream",
-            "uri",
-            "url"
         ]
     }
 ]
diff --git a/vendor/doctrine/cache/.coveralls.yml b/vendor/doctrine/cache/.coveralls.yml
deleted file mode 100644
index 0c08233..0000000
--- a/vendor/doctrine/cache/.coveralls.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-# for php-coveralls
-service_name: travis-ci
-src_dir: lib
-coverage_clover: build/logs/clover.xml
diff --git a/vendor/doctrine/cache/.travis.yml b/vendor/doctrine/cache/.travis.yml
deleted file mode 100644
index 2952a48..0000000
--- a/vendor/doctrine/cache/.travis.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-language: php
-
-php:
-  - 5.3
-  - 5.4
-  - 5.5
-  - 5.6
-  - hhvm
-
-services:
-    - riak
-    - mongodb
-    - memcached
-    - redis-server
-
-before_install:
-    - sh -c "if [ $TRAVIS_PHP_VERSION != 'hhvm' ]; then pecl install riak-beta; fi"
-    - sh -c "if [[ $TRAVIS_PHP_VERSION != 'hhvm' && `php-config --vernum` -ge 50500 ]] ; then pecl config-set preferred_state beta; printf "yes\n" | pecl install apcu ; else echo 'extension="apc.so"' >> ./tests/travis/php.ini ;fi"
-    - composer self-update
-    - sh -c "if [ $TRAVIS_PHP_VERSION != 'hhvm' ]; then phpenv config-add ./tests/travis/php.ini; fi"
-
-install:
-    - composer --prefer-source --dev install
-
-script:
-    - ./vendor/bin/phpunit -c ./tests/travis/phpunit.travis.xml -v
-
-after_script:
-    - php vendor/bin/coveralls -v
-
-matrix:
-  allow_failures:
-    - php: hhvm
diff --git a/vendor/doctrine/cache/LICENSE b/vendor/doctrine/cache/LICENSE
deleted file mode 100644
index 4a91f0b..0000000
--- a/vendor/doctrine/cache/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2006-2012 Doctrine Project
-
-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.
diff --git a/vendor/doctrine/cache/README.md b/vendor/doctrine/cache/README.md
deleted file mode 100644
index 94f80a3..0000000
--- a/vendor/doctrine/cache/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Doctrine Cache
-
-Master: [![Build Status](https://secure.travis-ci.org/doctrine/cache.png?branch=master)](http://travis-ci.org/doctrine/cache) [![Coverage Status](https://coveralls.io/repos/doctrine/cache/badge.png?branch=master)](https://coveralls.io/r/doctrine/cache?branch=master)
-
-[![Latest Stable Version](https://poser.pugx.org/doctrine/cache/v/stable.png)](https://packagist.org/packages/doctrine/cache) [![Total Downloads](https://poser.pugx.org/doctrine/cache/downloads.png)](https://packagist.org/packages/doctrine/cache)
-
-Cache component extracted from the Doctrine Common project.
-
-## Changelog
-
-### v1.2
-
-* Added support for MongoDB as Cache Provider
-* Fix namespace version reset
diff --git a/vendor/doctrine/cache/UPGRADE.md b/vendor/doctrine/cache/UPGRADE.md
deleted file mode 100644
index e1f8a50..0000000
--- a/vendor/doctrine/cache/UPGRADE.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Upgrade to 1.4
-
-## Minor BC Break: `Doctrine\Common\Cache\FileCache#$extension` is now `private`.
-
-If you need to override the value of `Doctrine\Common\Cache\FileCache#$extension`, then use the
-second parameter of `Doctrine\Common\Cache\FileCache#__construct()` instead of overriding
-the property in your own implementation.
-
-## Minor BC Break: file based caches paths changed
-
-`Doctrine\Common\Cache\FileCache`, `Doctrine\Common\Cache\PhpFileCache` and
-`Doctrine\Common\Cache\FilesystemCache` are using a different cache paths structure.
-
-If you rely on warmed up caches for deployments, consider that caches generated
-with `doctrine/cache` `<1.4` are not compatible with the new directory structure,
-and will be ignored.
diff --git a/vendor/doctrine/cache/build.properties b/vendor/doctrine/cache/build.properties
deleted file mode 100644
index 2d98c36..0000000
--- a/vendor/doctrine/cache/build.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-# Version class and file
-project.version_class = Doctrine\\Common\\Cache\\Version
-project.version_file = lib/Doctrine/Common/Cache/Version.php
diff --git a/vendor/doctrine/cache/build.xml b/vendor/doctrine/cache/build.xml
deleted file mode 100644
index a7c52e3..0000000
--- a/vendor/doctrine/cache/build.xml
+++ /dev/null
@@ -1,110 +0,0 @@
-<?xml version="1.0"?>
-<project name="DoctrineCommonCache" default="build" basedir=".">
-    <property file="build.properties" />
-
-    <target name="php">
-        <exec executable="which" outputproperty="php_executable">
-            <arg value="php" />
-        </exec>
-    </target>
-
-    <target name="prepare">
-        <mkdir dir="build" />
-    </target>
-
-    <target name="build" depends="check-git-checkout-clean,prepare,php,composer">
-        <exec executable="${php_executable}">
-            <arg value="build/composer.phar" />
-            <arg value="archive" />
-            <arg value="--dir=build" />
-        </exec>
-    </target>
-
-    <target name="composer" depends="php,composer-check,composer-download">
-        <exec executable="${php_executable}">
-            <arg value="build/composer.phar" />
-            <arg value="install" />
-        </exec>
-    </target>
-
-    <target name="composer-check" depends="prepare">
-        <available file="build/composer.phar" property="composer.present"/>
-    </target>
-
-    <target name="composer-download" unless="composer.present">
-        <exec executable="wget">
-            <arg value="-Obuild/composer.phar" />
-            <arg value="http://getcomposer.org/composer.phar" />
-        </exec>
-    </target>
-
-    <target name="make-release" depends="check-git-checkout-clean,prepare,php">
-        <replace file="${project.version_file}" token="-DEV" value="" failOnNoReplacements="true" />
-        <exec executable="git" failonerror="true" outputproperty="current_git_branch">
-            <arg value="rev-parse" />
-            <arg value="--abbrev-ref" />
-            <arg value="HEAD" />
-        </exec>
-        <exec executable="${php_executable}" outputproperty="doctrine.current_version" failonerror="true">
-            <arg value="-r" />
-            <arg value="require_once '${project.version_file}';echo ${project.version_class}::VERSION;" />
-        </exec>
-        <exec executable="${php_executable}" outputproperty="doctrine.next_version" failonerror="true">
-            <arg value="-r" />
-            <arg value="$parts = explode('.', str_ireplace(array('-DEV', '-ALPHA', '-BETA'), '', '${doctrine.current_version}'));
-                if (count($parts) != 3) {
-                    throw new \InvalidArgumentException('Version is assumed in format x.y.z, ${doctrine.current_version} given');
-                }
-                if ('${current_git_branch}' === 'master') {
-                    $parts[1]++;
-                } else {
-                    $parts[2]++;
-                }
-                echo implode('.', $parts);
-            " />
-        </exec>
-
-        <git-commit file="${project.version_file}" message="Release ${doctrine.current_version}" />
-        <git-tag version="${doctrine.current_version}" />
-        <replace file="${project.version_file}" token="${doctrine.current_version}" value="${doctrine.next_version}-DEV" />
-        <git-commit file="${project.version_file}" message="Bump version to ${doctrine.next_version}" />
-    </target>
-
-    <target name="check-git-checkout-clean">
-        <exec executable="git" failonerror="true">
-            <arg value="diff-index" />
-            <arg value="--quiet" />
-            <arg value="HEAD" />
-        </exec>
-    </target>
-
-    <macrodef name="git-commit">
-        <attribute name="file" default="NOT SET"/>
-        <attribute name="message" default="NOT SET"/>
-
-        <sequential>
-            <exec executable="git">
-                <arg value="add" />
-                <arg value="@{file}" />
-            </exec>
-            <exec executable="git">
-                <arg value="commit" />
-                <arg value="-m" />
-                <arg value="@{message}" />
-            </exec>
-        </sequential>
-    </macrodef>
-
-    <macrodef name="git-tag">
-        <attribute name="version" default="NOT SET" />
-
-        <sequential>
-            <exec executable="git">
-                <arg value="tag" />
-                <arg value="-m" />
-                <arg value="v@{version}" />
-                <arg value="v@{version}" />
-            </exec>
-        </sequential>
-    </macrodef>
-</project>
diff --git a/vendor/doctrine/cache/composer.json b/vendor/doctrine/cache/composer.json
deleted file mode 100644
index f3caa7a..0000000
--- a/vendor/doctrine/cache/composer.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-    "name": "doctrine/cache",
-    "type": "library",
-    "description": "Caching library offering an object-oriented API for many cache backends",
-    "keywords": ["cache", "caching"],
-    "homepage": "http://www.doctrine-project.org",
-    "license": "MIT",
-    "authors": [
-        {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"},
-        {"name": "Roman Borschel", "email": "roman@code-factory.org"},
-        {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"},
-        {"name": "Jonathan Wage", "email": "jonwage@gmail.com"},
-        {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"}
-    ],
-    "require": {
-        "php": ">=5.3.2"
-    },
-    "require-dev": {
-        "phpunit/phpunit":         ">=3.7",
-        "satooshi/php-coveralls":  "~0.6",
-        "predis/predis":           "~1.0"
-    },
-    "conflict": {
-        "doctrine/common": ">2.2,<2.4"
-    },
-    "autoload": {
-        "psr-0": { "Doctrine\\Common\\Cache\\": "lib/" }
-    },
-    "extra": {
-        "branch-alias": {
-            "dev-master": "1.5.x-dev"
-        }
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php
deleted file mode 100644
index 9319cb8..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * APC cache provider.
- *
- * @link   www.doctrine-project.org
- * @since  2.0
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author David Abdemoulaie <dave@hobodave.com>
- */
-class ApcCache extends CacheProvider
-{
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        return apc_fetch($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        return apc_exists($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        return (bool) apc_store($id, $data, (int) $lifeTime);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        // apc_delete returns false if the id does not exist
-        return apc_delete($id) || ! apc_exists($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        return apc_clear_cache() && apc_clear_cache('user');
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetchMultiple(array $keys)
-    {
-        return apc_fetch($keys);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        $info = apc_cache_info('', true);
-        $sma  = apc_sma_info();
-
-        // @TODO - Temporary fix @see https://github.com/krakjoe/apcu/pull/42
-        if (PHP_VERSION_ID >= 50500) {
-            $info['num_hits']   = isset($info['num_hits'])   ? $info['num_hits']   : $info['nhits'];
-            $info['num_misses'] = isset($info['num_misses']) ? $info['num_misses'] : $info['nmisses'];
-            $info['start_time'] = isset($info['start_time']) ? $info['start_time'] : $info['stime'];
-        }
-
-        return array(
-            Cache::STATS_HITS             => $info['num_hits'],
-            Cache::STATS_MISSES           => $info['num_misses'],
-            Cache::STATS_UPTIME           => $info['start_time'],
-            Cache::STATS_MEMORY_USAGE     => $info['mem_size'],
-            Cache::STATS_MEMORY_AVAILABLE => $sma['avail_mem'],
-        );
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php
deleted file mode 100644
index 31a0729..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Array cache driver.
- *
- * @link   www.doctrine-project.org
- * @since  2.0
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author David Abdemoulaie <dave@hobodave.com>
- */
-class ArrayCache extends CacheProvider
-{
-    /**
-     * @var array $data
-     */
-    private $data = array();
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        return $this->doContains($id) ? $this->data[$id] : false;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        // isset() is required for performance optimizations, to avoid unnecessary function calls to array_key_exists.
-        return isset($this->data[$id]) || array_key_exists($id, $this->data);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        $this->data[$id] = $data;
-
-        return true;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        unset($this->data[$id]);
-
-        return true;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        $this->data = array();
-
-        return true;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        return null;
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php
deleted file mode 100644
index fbb08ef..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Interface for cache drivers.
- *
- * @link   www.doctrine-project.org
- * @since  2.0
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- * @author Kévin Dunglas <dunglas@gmail.com>
- */
-interface Cache
-{
-    const STATS_HITS             = 'hits';
-    const STATS_MISSES           = 'misses';
-    const STATS_UPTIME           = 'uptime';
-    const STATS_MEMORY_USAGE     = 'memory_usage';
-    const STATS_MEMORY_AVAILABLE = 'memory_available';
-    /**
-     * Only for backward compatibility (may be removed in next major release)
-     *
-     * @deprecated
-     */
-    const STATS_MEMORY_AVAILIABLE = 'memory_available';
-
-    /**
-     * Fetches an entry from the cache.
-     *
-     * @param string $id The id of the cache entry to fetch.
-     *
-     * @return mixed The cached data or FALSE, if no cache entry exists for the given id.
-     */
-    public function fetch($id);
-
-    /**
-     * Tests if an entry exists in the cache.
-     *
-     * @param string $id The cache id of the entry to check for.
-     *
-     * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise.
-     */
-    public function contains($id);
-
-    /**
-     * Puts data into the cache.
-     *
-     * If a cache entry with the given id already exists, its data will be replaced.
-     *
-     * @param string $id       The cache id.
-     * @param mixed  $data     The cache entry/data.
-     * @param int    $lifeTime The lifetime in number of seconds for this cache entry.
-     *                         If zero (the default), the entry never expires (although it may be deleted from the cache
-     *                         to make place for other entries).
-     *
-     * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise.
-     */
-    public function save($id, $data, $lifeTime = 0);
-
-    /**
-     * Deletes a cache entry.
-     *
-     * @param string $id The cache id.
-     *
-     * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise.
-     *                 Deleting a non-existing entry is considered successful.
-     */
-    public function delete($id);
-
-    /**
-     * Retrieves cached information from the data store.
-     *
-     * The server's statistics array has the following values:
-     *
-     * - <b>hits</b>
-     * Number of keys that have been requested and found present.
-     *
-     * - <b>misses</b>
-     * Number of items that have been requested and not found.
-     *
-     * - <b>uptime</b>
-     * Time that the server is running.
-     *
-     * - <b>memory_usage</b>
-     * Memory used by this server to store items.
-     *
-     * - <b>memory_available</b>
-     * Memory allowed to use for storage.
-     *
-     * @since 2.2
-     *
-     * @return array|null An associative array with server's statistics if available, NULL otherwise.
-     */
-    public function getStats();
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php
deleted file mode 100644
index a367882..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php
+++ /dev/null
@@ -1,277 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Base class for cache provider implementations.
- *
- * @since  2.2
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- */
-abstract class CacheProvider implements Cache, FlushableCache, ClearableCache, MultiGetCache
-{
-    const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]';
-
-    /**
-     * The namespace to prefix all cache ids with.
-     *
-     * @var string
-     */
-    private $namespace = '';
-
-    /**
-     * The namespace version.
-     *
-     * @var integer|null
-     */
-    private $namespaceVersion;
-
-    /**
-     * Sets the namespace to prefix all cache ids with.
-     *
-     * @param string $namespace
-     *
-     * @return void
-     */
-    public function setNamespace($namespace)
-    {
-        $this->namespace        = (string) $namespace;
-        $this->namespaceVersion = null;
-    }
-
-    /**
-     * Retrieves the namespace that prefixes all cache ids.
-     *
-     * @return string
-     */
-    public function getNamespace()
-    {
-        return $this->namespace;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function fetch($id)
-    {
-        return $this->doFetch($this->getNamespacedId($id));
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function fetchMultiple(array $keys)
-    {
-        if (empty($keys)) {
-            return array();
-        }
-        
-        // note: the array_combine() is in place to keep an association between our $keys and the $namespacedKeys
-        $namespacedKeys = array_combine($keys, array_map(array($this, 'getNamespacedId'), $keys));
-        $items          = $this->doFetchMultiple($namespacedKeys);
-        $foundItems     = array();
-
-        // no internal array function supports this sort of mapping: needs to be iterative
-        // this filters and combines keys in one pass
-        foreach ($namespacedKeys as $requestedKey => $namespacedKey) {
-            if (isset($items[$namespacedKey]) || array_key_exists($namespacedKey, $items)) {
-                $foundItems[$requestedKey] = $items[$namespacedKey];
-            }
-        }
-
-        return $foundItems;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function contains($id)
-    {
-        return $this->doContains($this->getNamespacedId($id));
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function save($id, $data, $lifeTime = 0)
-    {
-        return $this->doSave($this->getNamespacedId($id), $data, $lifeTime);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function delete($id)
-    {
-        return $this->doDelete($this->getNamespacedId($id));
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getStats()
-    {
-        return $this->doGetStats();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public function flushAll()
-    {
-        return $this->doFlush();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public function deleteAll()
-    {
-        $namespaceCacheKey = $this->getNamespaceCacheKey();
-        $namespaceVersion  = $this->getNamespaceVersion() + 1;
-
-        if ($this->doSave($namespaceCacheKey, $namespaceVersion)) {
-            $this->namespaceVersion = $namespaceVersion;
-
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Prefixes the passed id with the configured namespace value.
-     *
-     * @param string $id The id to namespace.
-     *
-     * @return string The namespaced id.
-     */
-    private function getNamespacedId($id)
-    {
-        $namespaceVersion  = $this->getNamespaceVersion();
-
-        return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion);
-    }
-
-    /**
-     * Returns the namespace cache key.
-     *
-     * @return string
-     */
-    private function getNamespaceCacheKey()
-    {
-        return sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace);
-    }
-
-    /**
-     * Returns the namespace version.
-     *
-     * @return integer
-     */
-    private function getNamespaceVersion()
-    {
-        if (null !== $this->namespaceVersion) {
-            return $this->namespaceVersion;
-        }
-
-        $namespaceCacheKey = $this->getNamespaceCacheKey();
-        $this->namespaceVersion = $this->doFetch($namespaceCacheKey) ?: 1;
-
-        return $this->namespaceVersion;
-    }
-
-    /**
-     * Default implementation of doFetchMultiple. Each driver that supports multi-get should owerwrite it.
-     *
-     * @param array $keys Array of keys to retrieve from cache
-     * @return array Array of values retrieved for the given keys.
-     */
-    protected function doFetchMultiple(array $keys)
-    {
-        $returnValues = array();
-
-        foreach ($keys as $index => $key) {
-            if (false !== ($item = $this->doFetch($key))) {
-                $returnValues[$key] = $item;
-            }
-        }
-
-        return $returnValues;
-    }
-
-    /**
-     * Fetches an entry from the cache.
-     *
-     * @param string $id The id of the cache entry to fetch.
-     *
-     * @return mixed|boolean The cached data or FALSE, if no cache entry exists for the given id.
-     */
-    abstract protected function doFetch($id);
-
-    /**
-     * Tests if an entry exists in the cache.
-     *
-     * @param string $id The cache id of the entry to check for.
-     *
-     * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise.
-     */
-    abstract protected function doContains($id);
-
-    /**
-     * Puts data into the cache.
-     *
-     * @param string $id       The cache id.
-     * @param string $data     The cache entry/data.
-     * @param int    $lifeTime The lifetime. If != 0, sets a specific lifetime for this
-     *                           cache entry (0 => infinite lifeTime).
-     *
-     * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise.
-     */
-    abstract protected function doSave($id, $data, $lifeTime = 0);
-
-    /**
-     * Deletes a cache entry.
-     *
-     * @param string $id The cache id.
-     *
-     * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise.
-     */
-    abstract protected function doDelete($id);
-
-    /**
-     * Flushes all cache entries.
-     *
-     * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise.
-     */
-    abstract protected function doFlush();
-
-    /**
-     * Retrieves cached information from the data store.
-     *
-     * @since 2.2
-     *
-     * @return array|null An associative array with server's statistics if available, NULL otherwise.
-     */
-    abstract protected function doGetStats();
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php
deleted file mode 100644
index 96c9b54..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Cache provider that allows to easily chain multiple cache providers
- *
- * @author Michaël Gallego <mic.gallego@gmail.com>
- */
-class ChainCache extends CacheProvider
-{
-    /**
-     * @var CacheProvider[]
-     */
-    private $cacheProviders = array();
-
-    /**
-     * Constructor
-     *
-     * @param CacheProvider[] $cacheProviders
-     */
-    public function __construct($cacheProviders = array())
-    {
-        $this->cacheProviders = $cacheProviders;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public function setNamespace($namespace)
-    {
-        parent::setNamespace($namespace);
-
-        foreach ($this->cacheProviders as $cacheProvider) {
-            $cacheProvider->setNamespace($namespace);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function doFetch($id)
-    {
-        foreach ($this->cacheProviders as $key => $cacheProvider) {
-            if ($cacheProvider->doContains($id)) {
-                $value = $cacheProvider->doFetch($id);
-
-                // We populate all the previous cache layers (that are assumed to be faster)
-                for ($subKey = $key - 1 ; $subKey >= 0 ; $subKey--) {
-                    $this->cacheProviders[$subKey]->doSave($id, $value);
-                }
-
-                return $value;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function doContains($id)
-    {
-        foreach ($this->cacheProviders as $cacheProvider) {
-            if ($cacheProvider->doContains($id)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        $stored = true;
-
-        foreach ($this->cacheProviders as $cacheProvider) {
-            $stored = $cacheProvider->doSave($id, $data, $lifeTime) && $stored;
-        }
-
-        return $stored;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function doDelete($id)
-    {
-        $deleted = true;
-
-        foreach ($this->cacheProviders as $cacheProvider) {
-            $deleted = $cacheProvider->doDelete($id) && $deleted;
-        }
-
-        return $deleted;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function doFlush()
-    {
-        $flushed = true;
-
-        foreach ($this->cacheProviders as $cacheProvider) {
-            $flushed = $cacheProvider->doFlush() && $flushed;
-        }
-
-        return $flushed;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function doGetStats()
-    {
-        // We return all the stats from all adapters
-        $stats = array();
-
-        foreach ($this->cacheProviders as $cacheProvider) {
-            $stats[] = $cacheProvider->doGetStats();
-        }
-
-        return $stats;
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php
deleted file mode 100644
index d7b4358..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Interface for cache that can be flushed.
- *
- * Intended to be used for partial clearing of a cache namespace. For a more
- * global "flushing", see {@see FlushableCache}.
- *
- * @link   www.doctrine-project.org
- * @since  1.4
- * @author Adirelle <adirelle@gmail.com>
- */
-interface ClearableCache
-{
-    /**
-     * Deletes all cache entries in the current cache namespace.
-     *
-     * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise.
-     */
-    public function deleteAll();
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php
deleted file mode 100644
index c21691d..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-use \Couchbase;
-
-/**
- * Couchbase cache provider.
- *
- * @link   www.doctrine-project.org
- * @since  2.4
- * @author Michael Nitschinger <michael@nitschinger.at>
- */
-class CouchbaseCache extends CacheProvider
-{
-    /**
-     * @var Couchbase|null
-     */
-    private $couchbase;
-
-    /**
-     * Sets the Couchbase instance to use.
-     *
-     * @param Couchbase $couchbase
-     *
-     * @return void
-     */
-    public function setCouchbase(Couchbase $couchbase)
-    {
-        $this->couchbase = $couchbase;
-    }
-
-    /**
-     * Gets the Couchbase instance used by the cache.
-     *
-     * @return Couchbase|null
-     */
-    public function getCouchbase()
-    {
-        return $this->couchbase;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        return $this->couchbase->get($id) ?: false;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        return (null !== $this->couchbase->get($id));
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        if ($lifeTime > 30 * 24 * 3600) {
-            $lifeTime = time() + $lifeTime;
-        }
-        return $this->couchbase->set($id, $data, (int) $lifeTime);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        return $this->couchbase->delete($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        return $this->couchbase->flush();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        $stats   = $this->couchbase->getStats();
-        $servers = $this->couchbase->getServers();
-        $server  = explode(":", $servers[0]);
-        $key     = $server[0] . ":" . "11210";
-        $stats   = $stats[$key];
-        return array(
-            Cache::STATS_HITS   => $stats['get_hits'],
-            Cache::STATS_MISSES => $stats['get_misses'],
-            Cache::STATS_UPTIME => $stats['uptime'],
-            Cache::STATS_MEMORY_USAGE     => $stats['bytes'],
-            Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'],
-        );
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php
deleted file mode 100644
index f2b9ea8..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php
+++ /dev/null
@@ -1,261 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Base file cache driver.
- *
- * @since  2.3
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- */
-abstract class FileCache extends CacheProvider
-{
-    /**
-     * The cache directory.
-     *
-     * @var string
-     */
-    protected $directory;
-
-    /**
-     * The cache file extension.
-     *
-     * @var string
-     */
-    private $extension;
-
-    /**
-     * @var string[] regular expressions for replacing disallowed characters in file name
-     */
-    private $disallowedCharacterPatterns = array(
-        '/\-/', // replaced to disambiguate original `-` and `-` derived from replacements
-        '/[^a-zA-Z0-9\-_\[\]]/' // also excludes non-ascii chars (not supported, depending on FS)
-    );
-
-    /**
-     * @var string[] replacements for disallowed file characters
-     */
-    private $replacementCharacters = array('__', '-');
-
-    /**
-     * @var int
-     */
-    private $umask;
-
-    /**
-     * Constructor.
-     *
-     * @param string $directory The cache directory.
-     * @param string $extension The cache file extension.
-     *
-     * @throws \InvalidArgumentException
-     */
-    public function __construct($directory, $extension = '', $umask = 0002)
-    {
-        // YES, this needs to be *before* createPathIfNeeded()
-        if ( ! is_int($umask)) {
-            throw new \InvalidArgumentException(sprintf(
-                'The umask parameter is required to be integer, was: %s',
-                gettype($umask)
-            ));
-        }
-        $this->umask = $umask;
-
-        if ( ! $this->createPathIfNeeded($directory)) {
-            throw new \InvalidArgumentException(sprintf(
-                'The directory "%s" does not exist and could not be created.',
-                $directory
-            ));
-        }
-
-        if ( ! is_writable($directory)) {
-            throw new \InvalidArgumentException(sprintf(
-                'The directory "%s" is not writable.',
-                $directory
-            ));
-        }
-
-        // YES, this needs to be *after* createPathIfNeeded()
-        $this->directory = realpath($directory);
-        $this->extension = (string) $extension;
-    }
-
-    /**
-     * Gets the cache directory.
-     *
-     * @return string
-     */
-    public function getDirectory()
-    {
-        return $this->directory;
-    }
-
-    /**
-     * Gets the cache file extension.
-     *
-     * @return string|null
-     */
-    public function getExtension()
-    {
-        return $this->extension;
-    }
-
-    /**
-     * @param string $id
-     *
-     * @return string
-     */
-    protected function getFilename($id)
-    {
-        return $this->directory
-            . DIRECTORY_SEPARATOR
-            . implode(str_split(hash('sha256', $id), 2), DIRECTORY_SEPARATOR)
-            . DIRECTORY_SEPARATOR
-            . preg_replace($this->disallowedCharacterPatterns, $this->replacementCharacters, $id)
-            . $this->extension;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        $filename = $this->getFilename($id);
-
-        return @unlink($filename) || ! file_exists($filename);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        foreach ($this->getIterator() as $name => $file) {
-            if ($file->isDir()) {
-                // Remove the intermediate directories which have been created to balance the tree. It only takes effect
-                // if the directory is empty. If several caches share the same directory but with different file extensions,
-                // the other ones are not removed.
-                @rmdir($name);
-            } elseif ($this->isFilenameEndingWithExtension($name)) {
-                // If an extension is set, only remove files which end with the given extension.
-                // If no extension is set, we have no other choice than removing everything.
-                @unlink($name);
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        $usage = 0;
-        foreach ($this->getIterator() as $name => $file) {
-            if (! $file->isDir() && $this->isFilenameEndingWithExtension($name)) {
-                $usage += $file->getSize();
-            }
-        }
-
-        $free = disk_free_space($this->directory);
-
-        return array(
-            Cache::STATS_HITS               => null,
-            Cache::STATS_MISSES             => null,
-            Cache::STATS_UPTIME             => null,
-            Cache::STATS_MEMORY_USAGE       => $usage,
-            Cache::STATS_MEMORY_AVAILABLE   => $free,
-        );
-    }
-
-    /**
-     * Create path if needed.
-     *
-     * @param string $path
-     * @return bool TRUE on success or if path already exists, FALSE if path cannot be created.
-     */
-    private function createPathIfNeeded($path)
-    {
-        if ( ! is_dir($path)) {
-            if (false === @mkdir($path, 0777 & (~$this->umask), true) && !is_dir($path)) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Writes a string content to file in an atomic way.
-     *
-     * @param string $filename Path to the file where to write the data.
-     * @param string $content  The content to write
-     *
-     * @return bool TRUE on success, FALSE if path cannot be created, if path is not writable or an any other error.
-     */
-    protected function writeFile($filename, $content)
-    {
-        $filepath = pathinfo($filename, PATHINFO_DIRNAME);
-
-        if ( ! $this->createPathIfNeeded($filepath)) {
-            return false;
-        }
-
-        if ( ! is_writable($filepath)) {
-            return false;
-        }
-
-        $tmpFile = tempnam($filepath, 'swap');
-        @chmod($tmpFile, 0666 & (~$this->umask));
-
-        if (file_put_contents($tmpFile, $content) !== false) {
-            if (@rename($tmpFile, $filename)) {
-                return true;
-            }
-
-            @unlink($tmpFile);
-        }
-
-        return false;
-    }
-
-    /**
-     * @return \Iterator
-     */
-    private function getIterator()
-    {
-        return new \RecursiveIteratorIterator(
-            new \RecursiveDirectoryIterator($this->directory, \FilesystemIterator::SKIP_DOTS),
-            \RecursiveIteratorIterator::CHILD_FIRST
-        );
-    }
-
-    /**
-     * @param string $name The filename
-     *
-     * @return bool
-     */
-    private function isFilenameEndingWithExtension($name)
-    {
-        return '' === $this->extension
-            || strrpos($name, $this->extension) === (strlen($name) - strlen($this->extension));
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php
deleted file mode 100644
index d988294..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Filesystem cache driver.
- *
- * @since  2.3
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- */
-class FilesystemCache extends FileCache
-{
-    const EXTENSION = '.doctrinecache.data';
-
-    /**
-     * {@inheritdoc}
-     */
-    public function __construct($directory, $extension = self::EXTENSION, $umask = 0002)
-    {
-        parent::__construct($directory, $extension, $umask);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        $data     = '';
-        $lifetime = -1;
-        $filename = $this->getFilename($id);
-
-        if ( ! is_file($filename)) {
-            return false;
-        }
-
-        $resource = fopen($filename, "r");
-
-        if (false !== ($line = fgets($resource))) {
-            $lifetime = (int) $line;
-        }
-
-        if ($lifetime !== 0 && $lifetime < time()) {
-            fclose($resource);
-
-            return false;
-        }
-
-        while (false !== ($line = fgets($resource))) {
-            $data .= $line;
-        }
-
-        fclose($resource);
-
-        return unserialize($data);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        $lifetime = -1;
-        $filename = $this->getFilename($id);
-
-        if ( ! is_file($filename)) {
-            return false;
-        }
-
-        $resource = fopen($filename, "r");
-
-        if (false !== ($line = fgets($resource))) {
-            $lifetime = (int) $line;
-        }
-
-        fclose($resource);
-
-        return $lifetime === 0 || $lifetime > time();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        if ($lifeTime > 0) {
-            $lifeTime = time() + $lifeTime;
-        }
-
-        $data      = serialize($data);
-        $filename  = $this->getFilename($id);
-
-        return $this->writeFile($filename, $lifeTime . PHP_EOL . $data);
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php
deleted file mode 100644
index e4e606b..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Interface for cache that can be flushed.
- *
- * @link   www.doctrine-project.org
- * @since  1.4
- * @author Adirelle <adirelle@gmail.com>
- */
-interface FlushableCache
-{
-    /**
-     * Flushes all cache entries, globally.
-     *
-     * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise.
-     */
-    public function flushAll();
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php
deleted file mode 100644
index 8afaeea..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-use \Memcache;
-
-/**
- * Memcache cache provider.
- *
- * @link   www.doctrine-project.org
- * @since  2.0
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author David Abdemoulaie <dave@hobodave.com>
- */
-class MemcacheCache extends CacheProvider
-{
-    /**
-     * @var Memcache|null
-     */
-    private $memcache;
-
-    /**
-     * Sets the memcache instance to use.
-     *
-     * @param Memcache $memcache
-     *
-     * @return void
-     */
-    public function setMemcache(Memcache $memcache)
-    {
-        $this->memcache = $memcache;
-    }
-
-    /**
-     * Gets the memcache instance used by the cache.
-     *
-     * @return Memcache|null
-     */
-    public function getMemcache()
-    {
-        return $this->memcache;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        return $this->memcache->get($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        $flags = null;
-        $this->memcache->get($id, $flags);
-        
-        //if memcache has changed the value of "flags", it means the value exists
-        return ($flags !== null);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        if ($lifeTime > 30 * 24 * 3600) {
-            $lifeTime = time() + $lifeTime;
-        }
-        return $this->memcache->set($id, $data, 0, (int) $lifeTime);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        // Memcache::delete() returns false if entry does not exist
-        return $this->memcache->delete($id) || ! $this->doContains($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        return $this->memcache->flush();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        $stats = $this->memcache->getStats();
-        return array(
-            Cache::STATS_HITS   => $stats['get_hits'],
-            Cache::STATS_MISSES => $stats['get_misses'],
-            Cache::STATS_UPTIME => $stats['uptime'],
-            Cache::STATS_MEMORY_USAGE     => $stats['bytes'],
-            Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'],
-        );
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php
deleted file mode 100644
index deebe5a..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-use \Memcached;
-
-/**
- * Memcached cache provider.
- *
- * @link   www.doctrine-project.org
- * @since  2.2
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author David Abdemoulaie <dave@hobodave.com>
- */
-class MemcachedCache extends CacheProvider
-{
-    /**
-     * @var Memcached|null
-     */
-    private $memcached;
-
-    /**
-     * Sets the memcache instance to use.
-     *
-     * @param Memcached $memcached
-     *
-     * @return void
-     */
-    public function setMemcached(Memcached $memcached)
-    {
-        $this->memcached = $memcached;
-    }
-
-    /**
-     * Gets the memcached instance used by the cache.
-     *
-     * @return Memcached|null
-     */
-    public function getMemcached()
-    {
-        return $this->memcached;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        return $this->memcached->get($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetchMultiple(array $keys)
-    {
-        return $this->memcached->getMulti($keys);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        return false !== $this->memcached->get($id)
-            || $this->memcached->getResultCode() !== Memcached::RES_NOTFOUND;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        if ($lifeTime > 30 * 24 * 3600) {
-            $lifeTime = time() + $lifeTime;
-        }
-        return $this->memcached->set($id, $data, (int) $lifeTime);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        return $this->memcached->delete($id)
-            || $this->memcached->getResultCode() === Memcached::RES_NOTFOUND;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        return $this->memcached->flush();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        $stats   = $this->memcached->getStats();
-        $servers = $this->memcached->getServerList();
-        $key     = $servers[0]['host'] . ':' . $servers[0]['port'];
-        $stats   = $stats[$key];
-        return array(
-            Cache::STATS_HITS   => $stats['get_hits'],
-            Cache::STATS_MISSES => $stats['get_misses'],
-            Cache::STATS_UPTIME => $stats['uptime'],
-            Cache::STATS_MEMORY_USAGE     => $stats['bytes'],
-            Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'],
-        );
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php
deleted file mode 100644
index 99d2411..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php
+++ /dev/null
@@ -1,191 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-use MongoBinData;
-use MongoCollection;
-use MongoDate;
-
-/**
- * MongoDB cache provider.
- *
- * @since  1.1
- * @author Jeremy Mikola <jmikola@gmail.com>
- */
-class MongoDBCache extends CacheProvider
-{
-    /**
-     * The data field will store the serialized PHP value.
-     */
-    const DATA_FIELD = 'd';
-
-    /**
-     * The expiration field will store a MongoDate value indicating when the
-     * cache entry should expire.
-     *
-     * With MongoDB 2.2+, entries can be automatically deleted by MongoDB by
-     * indexing this field with the "expireAfterSeconds" option equal to zero.
-     * This will direct MongoDB to regularly query for and delete any entries
-     * whose date is older than the current time. Entries without a date value
-     * in this field will be ignored.
-     *
-     * The cache provider will also check dates on its own, in case expired
-     * entries are fetched before MongoDB's TTLMonitor pass can expire them.
-     *
-     * @see http://docs.mongodb.org/manual/tutorial/expire-data/
-     */
-    const EXPIRATION_FIELD = 'e';
-
-    /**
-     * @var MongoCollection
-     */
-    private $collection;
-
-    /**
-     * Constructor.
-     *
-     * This provider will default to the write concern and read preference
-     * options set on the MongoCollection instance (or inherited from MongoDB or
-     * MongoClient). Using an unacknowledged write concern (< 1) may make the
-     * return values of delete() and save() unreliable. Reading from secondaries
-     * may make contain() and fetch() unreliable.
-     *
-     * @see http://www.php.net/manual/en/mongo.readpreferences.php
-     * @see http://www.php.net/manual/en/mongo.writeconcerns.php
-     * @param MongoCollection $collection
-     */
-    public function __construct(MongoCollection $collection)
-    {
-        $this->collection = $collection;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        $document = $this->collection->findOne(array('_id' => $id), array(self::DATA_FIELD, self::EXPIRATION_FIELD));
-
-        if ($document === null) {
-            return false;
-        }
-
-        if ($this->isExpired($document)) {
-            $this->doDelete($id);
-            return false;
-        }
-
-        return unserialize($document[self::DATA_FIELD]->bin);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        $document = $this->collection->findOne(array('_id' => $id), array(self::EXPIRATION_FIELD));
-
-        if ($document === null) {
-            return false;
-        }
-
-        if ($this->isExpired($document)) {
-            $this->doDelete($id);
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        $result = $this->collection->update(
-            array('_id' => $id),
-            array('$set' => array(
-                self::EXPIRATION_FIELD => ($lifeTime > 0 ? new MongoDate(time() + $lifeTime) : null),
-                self::DATA_FIELD => new MongoBinData(serialize($data), MongoBinData::BYTE_ARRAY),
-            )),
-            array('upsert' => true, 'multiple' => false)
-        );
-
-        return isset($result['ok']) ? $result['ok'] == 1 : true;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        $result = $this->collection->remove(array('_id' => $id));
-
-        return isset($result['ok']) ? $result['ok'] == 1 : true;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        // Use remove() in lieu of drop() to maintain any collection indexes
-        $result = $this->collection->remove();
-
-        return isset($result['ok']) ? $result['ok'] == 1 : true;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        $serverStatus = $this->collection->db->command(array(
-            'serverStatus' => 1,
-            'locks' => 0,
-            'metrics' => 0,
-            'recordStats' => 0,
-            'repl' => 0,
-        ));
-
-        $collStats = $this->collection->db->command(array('collStats' => 1));
-
-        return array(
-            Cache::STATS_HITS => null,
-            Cache::STATS_MISSES => null,
-            Cache::STATS_UPTIME => (isset($serverStatus['uptime']) ? (int) $serverStatus['uptime'] : null),
-            Cache::STATS_MEMORY_USAGE => (isset($collStats['size']) ? (int) $collStats['size'] : null),
-            Cache::STATS_MEMORY_AVAILABLE  => null,
-        );
-    }
-
-    /**
-     * Check if the document is expired.
-     *
-     * @param array $document
-     * @return boolean
-     */
-    private function isExpired(array $document)
-    {
-        return isset($document[self::EXPIRATION_FIELD]) &&
-            $document[self::EXPIRATION_FIELD] instanceof MongoDate &&
-            $document[self::EXPIRATION_FIELD]->sec < time();
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php
deleted file mode 100644
index df7146d..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Interface for cache drivers that allows to get many items at once.
- *
- * @link   www.doctrine-project.org
- * @since  1.4
- * @author Asmir Mustafic <goetas@gmail.com>
- */
-interface MultiGetCache
-{
-    /**
-     * Returns an associative array of values for keys is found in cache.
-     *
-     * @param string[] $keys Array of keys to retrieve from cache
-     * @return mixed[] Array of retrieved values, indexed by the specified keys.
-     *                 Values that couldn't be retrieved are not contained in this array.
-     */
-    function fetchMultiple(array $keys);
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php
deleted file mode 100644
index 5e75196..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Php file cache driver.
- *
- * @since  2.3
- * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
- */
-class PhpFileCache extends FileCache
-{
-    const EXTENSION = '.doctrinecache.php';
-
-    /**
-     * {@inheritdoc}
-     */
-    public function __construct($directory, $extension = self::EXTENSION, $umask = 0002)
-    {
-        parent::__construct($directory, $extension, $umask);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        $value = $this->includeFileForId($id);
-
-        if (! $value) {
-            return false;
-        }
-
-        if ($value['lifetime'] !== 0 && $value['lifetime'] < time()) {
-            return false;
-        }
-
-        return $value['data'];
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        $value = $this->includeFileForId($id);
-
-        if (! $value) {
-            return false;
-        }
-
-        return $value['lifetime'] === 0 || $value['lifetime'] > time();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        if ($lifeTime > 0) {
-            $lifeTime = time() + $lifeTime;
-        }
-
-        if (is_object($data) && ! method_exists($data, '__set_state')) {
-            throw new \InvalidArgumentException(
-                "Invalid argument given, PhpFileCache only allows objects that implement __set_state() " .
-                "and fully support var_export(). You can use the FilesystemCache to save arbitrary object " .
-                "graphs using serialize()/deserialize()."
-            );
-        }
-
-        $filename  = $this->getFilename($id);
-
-        $value = array(
-            'lifetime'  => $lifeTime,
-            'data'      => $data
-        );
-
-        $value  = var_export($value, true);
-        $code   = sprintf('<?php return %s;', $value);
-
-        return $this->writeFile($filename, $code);
-    }
-
-    /**
-     * @param string $id
-     *
-     * @return array|false
-     */
-    private function includeFileForId($id)
-    {
-        $fileName = $this->getFilename($id);
-
-        // note: error suppression is still faster than `file_exists`, `is_file` and `is_readable`
-        $value = @include $fileName;
-
-        if (! isset($value['lifetime'])) {
-            return false;
-        }
-
-        return $value;
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php
deleted file mode 100644
index 3525014..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-
-namespace Doctrine\Common\Cache;
-
-use Predis\Client;
-
-/**
- * Predis cache provider.
- *
- * @author othillo <othillo@othillo.nl>
- */
-class PredisCache extends CacheProvider
-{
-    /**
-     * @var Client
-     */
-    private $client;
-
-    /**
-     * @param Client $client
-     *
-     * @return void
-     */
-    public function __construct(Client $client)
-    {
-        $this->client = $client;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        $result = $this->client->get($id);
-        if (null === $result) {
-            return false;
-        }
-
-        return unserialize($result);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetchMultiple(array $keys)
-    {
-        $fetchedItems = call_user_func_array(array($this->client, 'mget'), $keys);
-
-        return array_map('unserialize', array_filter(array_combine($keys, $fetchedItems)));
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        return $this->client->exists($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        $data = serialize($data);
-        if ($lifeTime > 0) {
-            $response = $this->client->setex($id, $lifeTime, $data);
-        } else {
-            $response = $this->client->set($id, $data);
-        }
-
-        return $response === true || $response == 'OK';
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        return $this->client->del($id) >= 0;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        $response = $this->client->flushdb();
-
-        return $response === true || $response == 'OK';
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        $info = $this->client->info();
-
-        return array(
-            Cache::STATS_HITS              => $info['Stats']['keyspace_hits'],
-            Cache::STATS_MISSES            => $info['Stats']['keyspace_misses'],
-            Cache::STATS_UPTIME            => $info['Server']['uptime_in_seconds'],
-            Cache::STATS_MEMORY_USAGE      => $info['Memory']['used_memory'],
-            Cache::STATS_MEMORY_AVAILABLE  => false
-        );
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php
deleted file mode 100644
index c64890e..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php
+++ /dev/null
@@ -1,149 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-use Redis;
-
-/**
- * Redis cache provider.
- *
- * @link   www.doctrine-project.org
- * @since  2.2
- * @author Osman Ungur <osmanungur@gmail.com>
- */
-class RedisCache extends CacheProvider
-{
-    /**
-     * @var Redis|null
-     */
-    private $redis;
-
-    /**
-     * Sets the redis instance to use.
-     *
-     * @param Redis $redis
-     *
-     * @return void
-     */
-    public function setRedis(Redis $redis)
-    {
-        $redis->setOption(Redis::OPT_SERIALIZER, $this->getSerializerValue());
-        $this->redis = $redis;
-    }
-
-    /**
-     * Gets the redis instance used by the cache.
-     *
-     * @return Redis|null
-     */
-    public function getRedis()
-    {
-        return $this->redis;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        return $this->redis->get($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetchMultiple(array $keys)
-    {
-        $fetchedItems = $this->redis->mget($keys);
-
-        return array_filter(
-            array_combine($keys, $fetchedItems),
-            function ($value) {
-                return $value !== false;
-            }
-        );
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        return $this->redis->exists($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        if ($lifeTime > 0) {
-            return $this->redis->setex($id, $lifeTime, $data);
-        }
-
-        return $this->redis->set($id, $data);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        return $this->redis->delete($id) >= 0;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        return $this->redis->flushDB();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        $info = $this->redis->info();
-        return array(
-            Cache::STATS_HITS   => $info['keyspace_hits'],
-            Cache::STATS_MISSES => $info['keyspace_misses'],
-            Cache::STATS_UPTIME => $info['uptime_in_seconds'],
-            Cache::STATS_MEMORY_USAGE      => $info['used_memory'],
-            Cache::STATS_MEMORY_AVAILABLE  => false
-        );
-    }
-
-    /**
-     * Returns the serializer constant to use. If Redis is compiled with
-     * igbinary support, that is used. Otherwise the default PHP serializer is
-     * used.
-     *
-     * @return integer One of the Redis::SERIALIZER_* constants
-     */
-    protected function getSerializerValue()
-    {
-        if (defined('HHVM_VERSION')) {
-            return Redis::SERIALIZER_PHP;
-        }
-        return defined('Redis::SERIALIZER_IGBINARY') ? Redis::SERIALIZER_IGBINARY : Redis::SERIALIZER_PHP;
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php
deleted file mode 100644
index 8bb6b4b..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php
+++ /dev/null
@@ -1,250 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-use Riak\Bucket;
-use Riak\Connection;
-use Riak\Input;
-use Riak\Exception;
-use Riak\Object;
-
-/**
- * Riak cache provider.
- *
- * @link   www.doctrine-project.org
- * @since  1.1
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- */
-class RiakCache extends CacheProvider
-{
-    const EXPIRES_HEADER = 'X-Riak-Meta-Expires';
-
-    /**
-     * @var \Riak\Bucket
-     */
-    private $bucket;
-
-    /**
-     * Sets the riak bucket instance to use.
-     *
-     * @param \Riak\Bucket $bucket
-     */
-    public function __construct(Bucket $bucket)
-    {
-        $this->bucket = $bucket;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        try {
-            $response = $this->bucket->get($id);
-
-            // No objects found
-            if ( ! $response->hasObject()) {
-                return false;
-            }
-
-            // Check for attempted siblings
-            $object = ($response->hasSiblings())
-                ? $this->resolveConflict($id, $response->getVClock(), $response->getObjectList())
-                : $response->getFirstObject();
-
-            // Check for expired object
-            if ($this->isExpired($object)) {
-                $this->bucket->delete($object);
-
-                return false;
-            }
-
-            return unserialize($object->getContent());
-        } catch (Exception\RiakException $e) {
-            // Covers:
-            // - Riak\ConnectionException
-            // - Riak\CommunicationException
-            // - Riak\UnexpectedResponseException
-            // - Riak\NotFoundException
-        }
-
-        return false;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        try {
-            // We only need the HEAD, not the entire object
-            $input = new Input\GetInput();
-
-            $input->setReturnHead(true);
-
-            $response = $this->bucket->get($id, $input);
-
-            // No objects found
-            if ( ! $response->hasObject()) {
-                return false;
-            }
-
-            $object = $response->getFirstObject();
-
-            // Check for expired object
-            if ($this->isExpired($object)) {
-                $this->bucket->delete($object);
-
-                return false;
-            }
-
-            return true;
-        } catch (Exception\RiakException $e) {
-            // Do nothing
-        }
-
-        return false;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        try {
-            $object = new Object($id);
-
-            $object->setContent(serialize($data));
-
-            if ($lifeTime > 0) {
-                $object->addMetadata(self::EXPIRES_HEADER, (string) (time() + $lifeTime));
-            }
-
-            $this->bucket->put($object);
-
-            return true;
-        } catch (Exception\RiakException $e) {
-            // Do nothing
-        }
-
-        return false;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        try {
-            $this->bucket->delete($id);
-
-            return true;
-        } catch (Exception\BadArgumentsException $e) {
-            // Key did not exist on cluster already
-        } catch (Exception\RiakException $e) {
-            // Covers:
-            // - Riak\Exception\ConnectionException
-            // - Riak\Exception\CommunicationException
-            // - Riak\Exception\UnexpectedResponseException
-        }
-
-        return false;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        try {
-            $keyList = $this->bucket->getKeyList();
-
-            foreach ($keyList as $key) {
-                $this->bucket->delete($key);
-            }
-
-            return true;
-        } catch (Exception\RiakException $e) {
-            // Do nothing
-        }
-
-        return false;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        // Only exposed through HTTP stats API, not Protocol Buffers API
-        return null;
-    }
-
-    /**
-     * Check if a given Riak Object have expired.
-     *
-     * @param \Riak\Object $object
-     *
-     * @return boolean
-     */
-    private function isExpired(Object $object)
-    {
-        $metadataMap = $object->getMetadataMap();
-
-        return isset($metadataMap[self::EXPIRES_HEADER])
-            && $metadataMap[self::EXPIRES_HEADER] < time();
-    }
-
-    /**
-     * On-read conflict resolution. Applied approach here is last write wins.
-     * Specific needs may override this method to apply alternate conflict resolutions.
-     *
-     * {@internal Riak does not attempt to resolve a write conflict, and store
-     * it as sibling of conflicted one. By following this approach, it is up to
-     * the next read to resolve the conflict. When this happens, your fetched
-     * object will have a list of siblings (read as a list of objects).
-     * In our specific case, we do not care about the intermediate ones since
-     * they are all the same read from storage, and we do apply a last sibling
-     * (last write) wins logic.
-     * If by any means our resolution generates another conflict, it'll up to
-     * next read to properly solve it.}
-     *
-     * @param string $id
-     * @param string $vClock
-     * @param array  $objectList
-     *
-     * @return \Riak\Object
-     */
-    protected function resolveConflict($id, $vClock, array $objectList)
-    {
-        // Our approach here is last-write wins
-        $winner = $objectList[count($objectList)];
-
-        $putInput = new Input\PutInput();
-        $putInput->setVClock($vClock);
-
-        $mergedObject = new Object($id);
-        $mergedObject->setContent($winner->getContent());
-
-        $this->bucket->put($mergedObject, $putInput);
-
-        return $mergedObject;
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php
deleted file mode 100644
index b12978c..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php
+++ /dev/null
@@ -1,219 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-use SQLite3;
-use SQLite3Result;
-
-/**
- * SQLite3 cache provider.
- *
- * @since  1.4
- * @author Jake Bell <jake@theunraveler.com>
- */
-class SQLite3Cache extends CacheProvider
-{
-    /**
-     * The ID field will store the cache key.
-     */
-    const ID_FIELD = 'k';
-
-    /**
-     * The data field will store the serialized PHP value.
-     */
-    const DATA_FIELD = 'd';
-
-    /**
-     * The expiration field will store a date value indicating when the
-     * cache entry should expire.
-     */
-    const EXPIRATION_FIELD = 'e';
-
-    /**
-     * @var SQLite3
-     */
-    private $sqlite;
-
-    /**
-     * @var string
-     */
-    private $table;
-
-    /**
-     * Constructor.
-     *
-     * Calling the constructor will ensure that the database file and table 
-     * exist and will create both if they don't.
-     *
-     * @param SQLite3 $sqlite
-     * @param string $table
-     */
-    public function __construct(SQLite3 $sqlite, $table)
-    {
-        $this->sqlite = $sqlite;
-        $this->table  = (string) $table;
-
-        list($id, $data, $exp) = $this->getFields();
-
-        return $this->sqlite->exec(sprintf(
-            'CREATE TABLE IF NOT EXISTS %s(%s TEXT PRIMARY KEY NOT NULL, %s BLOB, %s INTEGER)',
-            $table,
-            $id,
-            $data,
-            $exp
-        ));
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        if ($item = $this->findById($id)) {
-            return unserialize($item[self::DATA_FIELD]);
-        }
-
-        return false;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        return (boolean) $this->findById($id, false);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        $statement = $this->sqlite->prepare(sprintf(
-            'INSERT OR REPLACE INTO %s (%s) VALUES (:id, :data, :expire)',
-            $this->table,
-            implode(',', $this->getFields())
-        ));
-
-        $statement->bindValue(':id', $id);
-        $statement->bindValue(':data', serialize($data), SQLITE3_BLOB);
-        $statement->bindValue(':expire', $lifeTime > 0 ? time() + $lifeTime : null);
-
-        return $statement->execute() instanceof SQLite3Result;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        list($idField) = $this->getFields();
-
-        $statement = $this->sqlite->prepare(sprintf(
-            'DELETE FROM %s WHERE %s = :id',
-            $this->table,
-            $idField
-        ));
-
-        $statement->bindValue(':id', $id);
-
-        return $statement->execute() instanceof SQLite3Result;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        return $this->sqlite->exec(sprintf('DELETE FROM %s', $this->table));
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        // no-op.
-    }
-
-    /**
-     * Find a single row by ID.
-     *
-     * @param mixed $id
-     * @param boolean $includeData
-     *
-     * @return array|null
-     */
-    private function findById($id, $includeData = true)
-    {
-        list($idField) = $fields = $this->getFields();
-
-        if (!$includeData) {
-            $key = array_search(static::DATA_FIELD, $fields);
-            unset($fields[$key]);
-        }
-
-        $statement = $this->sqlite->prepare(sprintf(
-            'SELECT %s FROM %s WHERE %s = :id LIMIT 1',
-            implode(',', $fields),
-            $this->table,
-            $idField
-        ));
-
-        $statement->bindValue(':id', $id, SQLITE3_TEXT);
-
-        $item = $statement->execute()->fetchArray(SQLITE3_ASSOC);
-
-        if ($item === false) {
-            return null;
-        }
-
-        if ($this->isExpired($item)) {
-            $this->doDelete($id);
-
-            return null;
-        }
-
-        return $item;
-    }
-
-    /**
-     * Gets an array of the fields in our table.
-     *
-     * @return array
-     */
-    private function getFields()
-    {
-        return array(static::ID_FIELD, static::DATA_FIELD, static::EXPIRATION_FIELD);
-    }
-
-    /**
-     * Check if the item is expired.
-     *
-     * @param array $item
-     * @return boolean
-     */
-    private function isExpired(array $item)
-    {
-        return isset($item[static::EXPIRATION_FIELD]) &&
-            $item[self::EXPIRATION_FIELD] !== null &&
-            $item[self::EXPIRATION_FIELD] < time();
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php
deleted file mode 100644
index 3d24fac..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-class Version
-{
-    const VERSION = '1.4.4';
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php
deleted file mode 100644
index 65e8456..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Void cache driver. The cache could be of use in tests where you don`t need to cache anything.
- *
- * @link   www.doctrine-project.org
- * @since  1.5
- * @author Kotlyar Maksim <kotlyar.maksim@gmail.com>
- */
-class VoidCache extends CacheProvider
-{
-    /**
-     * {@inheritDoc}
-     */
-    protected function doFetch($id)
-    {
-        return false;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function doContains($id)
-    {
-        return false;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function doDelete($id)
-    {
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function doFlush()
-    {
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function doGetStats()
-    {
-        return;
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php
deleted file mode 100644
index ae32772..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * WinCache cache provider.
- *
- * @link   www.doctrine-project.org
- * @since  2.2
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author David Abdemoulaie <dave@hobodave.com>
- */
-class WinCacheCache extends CacheProvider
-{
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        return wincache_ucache_get($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        return wincache_ucache_exists($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        return (bool) wincache_ucache_set($id, $data, (int) $lifeTime);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        return wincache_ucache_delete($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        return wincache_ucache_clear();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        $info    = wincache_ucache_info();
-        $meminfo = wincache_ucache_meminfo();
-
-        return array(
-            Cache::STATS_HITS             => $info['total_hit_count'],
-            Cache::STATS_MISSES           => $info['total_miss_count'],
-            Cache::STATS_UPTIME           => $info['total_cache_uptime'],
-            Cache::STATS_MEMORY_USAGE     => $meminfo['memory_total'],
-            Cache::STATS_MEMORY_AVAILABLE => $meminfo['memory_free'],
-        );
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php
deleted file mode 100644
index a2c4ca5..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Xcache cache driver.
- *
- * @link   www.doctrine-project.org
- * @since  2.0
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Jonathan Wage <jonwage@gmail.com>
- * @author Roman Borschel <roman@code-factory.org>
- * @author David Abdemoulaie <dave@hobodave.com>
- */
-class XcacheCache extends CacheProvider
-{
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        return $this->doContains($id) ? unserialize(xcache_get($id)) : false;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        return xcache_isset($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        return xcache_set($id, serialize($data), (int) $lifeTime);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        return xcache_unset($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        $this->checkAuthorization();
-
-        xcache_clear_cache(XC_TYPE_VAR);
-
-        return true;
-    }
-
-    /**
-     * Checks that xcache.admin.enable_auth is Off.
-     *
-     * @return void
-     *
-     * @throws \BadMethodCallException When xcache.admin.enable_auth is On.
-     */
-    protected function checkAuthorization()
-    {
-        if (ini_get('xcache.admin.enable_auth')) {
-            throw new \BadMethodCallException(
-                'To use all features of \Doctrine\Common\Cache\XcacheCache, '
-                . 'you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'
-            );
-        }
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        $this->checkAuthorization();
-
-        $info = xcache_info(XC_TYPE_VAR, 0);
-        return array(
-            Cache::STATS_HITS   => $info['hits'],
-            Cache::STATS_MISSES => $info['misses'],
-            Cache::STATS_UPTIME => null,
-            Cache::STATS_MEMORY_USAGE      => $info['size'],
-            Cache::STATS_MEMORY_AVAILABLE  => $info['avail'],
-        );
-    }
-}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php
deleted file mode 100644
index 6e35ac8..0000000
--- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-/*
- * 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.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\Common\Cache;
-
-/**
- * Zend Data Cache cache driver.
- *
- * @link   www.doctrine-project.org
- * @since  2.0
- * @author Ralph Schindler <ralph.schindler@zend.com>
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- */
-class ZendDataCache extends CacheProvider
-{
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFetch($id)
-    {
-        return zend_shm_cache_fetch($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doContains($id)
-    {
-        return (false !== zend_shm_cache_fetch($id));
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doSave($id, $data, $lifeTime = 0)
-    {
-        return zend_shm_cache_store($id, $data, $lifeTime);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doDelete($id)
-    {
-        return zend_shm_cache_delete($id);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doFlush()
-    {
-        $namespace = $this->getNamespace();
-        if (empty($namespace)) {
-            return zend_shm_cache_clear();
-        }
-        return zend_shm_cache_clear($namespace);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function doGetStats()
-    {
-        return null;
-    }
-}
diff --git a/vendor/doctrine/cache/phpunit.xml.dist b/vendor/doctrine/cache/phpunit.xml.dist
deleted file mode 100644
index 34d7f4c..0000000
--- a/vendor/doctrine/cache/phpunit.xml.dist
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<phpunit backupGlobals="false"
-         backupStaticAttributes="false"
-         colors="true"
-         convertErrorsToExceptions="true"
-         convertNoticesToExceptions="true"
-         convertWarningsToExceptions="true"
-         processIsolation="false"
-         stopOnFailure="false"
-         syntaxCheck="false"
-         bootstrap="./tests/Doctrine/Tests/TestInit.php"
->
-    <testsuites>
-        <testsuite name="Doctrine Cache Test Suite">
-            <directory>./tests/Doctrine/</directory>
-        </testsuite>
-    </testsuites>
-
-    <filter>
-        <whitelist>
-            <directory>./lib/Doctrine/</directory>
-        </whitelist>
-    </filter>
-</phpunit>
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php
deleted file mode 100644
index df81262..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\ApcCache;
-
-class ApcCacheTest extends CacheTest
-{
-    public function setUp()
-    {
-        if ( ! extension_loaded('apc') || false === @apc_cache_info()) {
-            $this->markTestSkipped('The ' . __CLASS__ .' requires the use of APC');
-        }
-    }
-
-    protected function _getCacheDriver()
-    {
-        return new ApcCache();
-    }
-}
\ No newline at end of file
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php
deleted file mode 100644
index a6c3097..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\ArrayCache;
-
-class ArrayCacheTest extends CacheTest
-{
-    protected function _getCacheDriver()
-    {
-        return new ArrayCache();
-    }
-
-    public function testGetStats()
-    {
-        $cache = $this->_getCacheDriver();
-        $stats = $cache->getStats();
-
-        $this->assertNull($stats);
-    }
-
-    protected function isSharedStorage()
-    {
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/BaseFileCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/BaseFileCacheTest.php
deleted file mode 100644
index ef138ab..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/BaseFileCacheTest.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use RecursiveDirectoryIterator;
-use RecursiveIteratorIterator;
-
-abstract class BaseFileCacheTest extends CacheTest
-{
-    protected $directory;
-
-    public function testFlushAllRemovesBalancingDirectories()
-    {
-        $cache = $this->_getCacheDriver();
-
-        $this->assertTrue($cache->save('key1', 1));
-        $this->assertTrue($cache->save('key2', 2));
-        $this->assertTrue($cache->flushAll());
-
-        $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->directory, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::CHILD_FIRST);
-
-        $this->assertCount(0, $iterator);
-    }
-
-    protected function setUp()
-    {
-        do {
-            $this->directory = sys_get_temp_dir() . '/doctrine_cache_'. uniqid();
-        } while (file_exists($this->directory));
-    }
-
-    protected function tearDown()
-    {
-        if ( ! is_dir($this->directory)) {
-            return;
-        }
-
-        $iterator = new RecursiveDirectoryIterator($this->directory);
-
-        foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $file) {
-            if ($file->isFile()) {
-                @unlink($file->getRealPath());
-            } elseif ($file->isDir()) {
-                @rmdir($file->getRealPath());
-            }
-        }
-
-        @rmdir($this->directory);
-    }
-
-    protected function isSharedStorage()
-    {
-        return false;
-    }
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheProviderTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheProviderTest.php
deleted file mode 100644
index 2b32592..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheProviderTest.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-class CacheProviderTest extends \Doctrine\Tests\DoctrineTestCase
-{
-    public function testFetchMultiWillFilterNonRequestedKeys()
-    {
-        /* @var $cache \Doctrine\Common\Cache\CacheProvider|\PHPUnit_Framework_MockObject_MockObject */
-        $cache = $this->getMockForAbstractClass(
-            'Doctrine\Common\Cache\CacheProvider',
-            array(),
-            '',
-            true,
-            true,
-            true,
-            array('doFetchMultiple')
-        );
-
-        $cache
-            ->expects($this->once())
-            ->method('doFetchMultiple')
-            ->will($this->returnValue(array(
-                '[foo][1]' => 'bar',
-                '[bar][1]' => 'baz',
-                '[baz][1]' => 'tab',
-            )));
-
-        $this->assertEquals(
-            array('foo' => 'bar', 'bar' => 'baz'),
-            $cache->fetchMultiple(array('foo', 'bar'))
-        );
-    }
-
-    public function testFailedDeleteAllDoesNotChangeNamespaceVersion()
-    {
-        /* @var $cache \Doctrine\Common\Cache\CacheProvider|\PHPUnit_Framework_MockObject_MockObject */
-        $cache = $this->getMockForAbstractClass(
-            'Doctrine\Common\Cache\CacheProvider',
-            array(),
-            '',
-            true,
-            true,
-            true,
-            array('doFetch', 'doSave', 'doContains')
-        );
-
-        $cache
-            ->expects($this->once())
-            ->method('doFetch')
-            ->with('DoctrineNamespaceCacheKey[]')
-            ->will($this->returnValue(false));
-
-        // doSave is only called once from deleteAll as we do not need to persist the default version in getNamespaceVersion()
-        $cache
-            ->expects($this->once())
-            ->method('doSave')
-            ->with('DoctrineNamespaceCacheKey[]')
-            ->will($this->returnValue(false));
-
-        // After a failed deleteAll() the local namespace version is not increased (still 1). Otherwise all data written afterwards
-        // would be lost outside the current instance.
-        $cache
-            ->expects($this->once())
-            ->method('doContains')
-            ->with('[key][1]')
-            ->will($this->returnValue(true));
-
-        $this->assertFalse($cache->deleteAll(), 'deleteAll() returns false when saving the namespace version fails');
-        $cache->contains('key');
-    }
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheTest.php
deleted file mode 100644
index bdad072..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CacheTest.php
+++ /dev/null
@@ -1,381 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\Cache;
-use ArrayObject;
-
-abstract class CacheTest extends \Doctrine\Tests\DoctrineTestCase
-{
-    /**
-     * @dataProvider provideDataToCache
-     */
-    public function testSetContainsFetchDelete($value)
-    {
-        $cache = $this->_getCacheDriver();
-
-        // Test saving a value, checking if it exists, and fetching it back
-        $this->assertTrue($cache->save('key', $value));
-        $this->assertTrue($cache->contains('key'));
-        if (is_object($value)) {
-            $this->assertEquals($value, $cache->fetch('key'), 'Objects retrieved from the cache must be equal but not necessarily the same reference');
-        } else {
-            $this->assertSame($value, $cache->fetch('key'), 'Scalar and array data retrieved from the cache must be the same as the original, e.g. same type');
-        }
-
-        // Test deleting a value
-        $this->assertTrue($cache->delete('key'));
-        $this->assertFalse($cache->contains('key'));
-        $this->assertFalse($cache->fetch('key'));
-    }
-
-    /**
-     * @dataProvider provideDataToCache
-     */
-    public function testUpdateExistingEntry($value)
-    {
-        $cache = $this->_getCacheDriver();
-
-        $this->assertTrue($cache->save('key', 'old-value'));
-        $this->assertTrue($cache->contains('key'));
-
-        $this->assertTrue($cache->save('key', $value));
-        $this->assertTrue($cache->contains('key'));
-        if (is_object($value)) {
-            $this->assertEquals($value, $cache->fetch('key'), 'Objects retrieved from the cache must be equal but not necessarily the same reference');
-        } else {
-            $this->assertSame($value, $cache->fetch('key'), 'Scalar and array data retrieved from the cache must be the same as the original, e.g. same type');
-        }
-    }
-
-    public function testFetchMulti()
-    {
-        $cache = $this->_getCacheDriver();
-
-        $cache->deleteAll();
-
-        // Test saving some values, checking if it exists, and fetching it back with multiGet
-        $this->assertTrue($cache->save('key1', 'value1'));
-        $this->assertTrue($cache->save('key2', 'value2'));
-
-        $this->assertEquals(
-            array('key1' => 'value1', 'key2' => 'value2'),
-            $cache->fetchMultiple(array('key1', 'key2'))
-        );
-        $this->assertEquals(
-            array('key1' => 'value1', 'key2' => 'value2'),
-            $cache->fetchMultiple(array('key1', 'key3', 'key2'))
-        );
-        $this->assertEquals(
-            array('key1' => 'value1', 'key2' => 'value2'),
-            $cache->fetchMultiple(array('key1', 'key2', 'key3'))
-        );
-    }
-
-    public function testFetchMultiWithEmptyKeysArray()
-    {
-        $cache = $this->_getCacheDriver();
-        
-        $this->assertEmpty(
-            $cache->fetchMultiple(array())
-        );
-    }
-
-    public function testFetchMultiWithFalsey()
-    {
-        $cache = $this->_getCacheDriver();
-
-        $cache->deleteAll();
-
-        $values = array(
-            'string' => 'str',
-            'integer' => 1,
-            'boolean' => true,
-            'null' => null,
-            'array_empty' => array(),
-            'integer_zero' => 0,
-            'string_empty' => ''
-        );
-        foreach ($values AS $key => $value) {
-            $cache->save($key, $value);
-        }
-
-        $this->assertEquals(
-            $values,
-            $cache->fetchMultiple(array_keys($values))
-        );
-    }
-
-    public function provideDataToCache()
-    {
-        return array(
-            'array' => array(array('one', 2, 3.01)),
-            'string' => array('value'),
-            'integer' => array(1),
-            'float' => array(1.5),
-            'object' => array(new ArrayObject()),
-            'true' => array(true),
-            // the following are considered FALSE in boolean context, but caches should still recognize their existence
-            'null' => array(null),
-            'false' => array(false),
-            'array_empty' => array(array()),
-            'string_zero' => array('0'),
-            'integer_zero' => array(0),
-            'float_zero' => array(0.0),
-            'string_empty' => array('')
-        );
-    }
-
-    public function testDeleteIsSuccessfulWhenKeyDoesNotExist()
-    {
-        $cache = $this->_getCacheDriver();
-
-        $this->assertFalse($cache->contains('key'));
-        $this->assertTrue($cache->delete('key'));
-    }
-
-    public function testDeleteAll()
-    {
-        $cache = $this->_getCacheDriver();
-
-        $this->assertTrue($cache->save('key1', 1));
-        $this->assertTrue($cache->save('key2', 2));
-        $this->assertTrue($cache->deleteAll());
-        $this->assertFalse($cache->contains('key1'));
-        $this->assertFalse($cache->contains('key2'));
-    }
-
-    public function testDeleteAllAndNamespaceVersioningBetweenCaches()
-    {
-        if ( ! $this->isSharedStorage()) {
-            $this->markTestSkipped('The ' . __CLASS__ .' does not use shared storage');
-        }
-
-        $cache1 = $this->_getCacheDriver();
-        $cache2 = $this->_getCacheDriver();
-
-        $this->assertTrue($cache1->save('key1', 1));
-        $this->assertTrue($cache2->save('key2', 2));
-
-        /* Both providers are initialized with the same namespace version, so
-         * they can see entries set by each other.
-         */
-        $this->assertTrue($cache1->contains('key1'));
-        $this->assertTrue($cache1->contains('key2'));
-        $this->assertTrue($cache2->contains('key1'));
-        $this->assertTrue($cache2->contains('key2'));
-
-        /* Deleting all entries through one provider will only increment the
-         * namespace version on that object (and in the cache itself, which new
-         * instances will use to initialize). The second provider will retain
-         * its original version and still see stale data.
-         */
-        $this->assertTrue($cache1->deleteAll());
-        $this->assertFalse($cache1->contains('key1'));
-        $this->assertFalse($cache1->contains('key2'));
-        $this->assertTrue($cache2->contains('key1'));
-        $this->assertTrue($cache2->contains('key2'));
-
-        /* A new cache provider should not see the deleted entries, since its
-         * namespace version will be initialized.
-         */
-        $cache3 = $this->_getCacheDriver();
-        $this->assertFalse($cache3->contains('key1'));
-        $this->assertFalse($cache3->contains('key2'));
-    }
-
-    public function testFlushAll()
-    {
-        $cache = $this->_getCacheDriver();
-
-        $this->assertTrue($cache->save('key1', 1));
-        $this->assertTrue($cache->save('key2', 2));
-        $this->assertTrue($cache->flushAll());
-        $this->assertFalse($cache->contains('key1'));
-        $this->assertFalse($cache->contains('key2'));
-    }
-
-    public function testFlushAllAndNamespaceVersioningBetweenCaches()
-    {
-        if ( ! $this->isSharedStorage()) {
-            $this->markTestSkipped('The ' . __CLASS__ .' does not use shared storage');
-        }
-
-        $cache1 = $this->_getCacheDriver();
-        $cache2 = $this->_getCacheDriver();
-
-        /* Deleting all elements from the first provider should increment its
-         * namespace version before saving the first entry.
-         */
-        $cache1->deleteAll();
-        $this->assertTrue($cache1->save('key1', 1));
-
-        /* The second provider will be initialized with the same namespace
-         * version upon its first save operation.
-         */
-        $this->assertTrue($cache2->save('key2', 2));
-
-        /* Both providers have the same namespace version and can see entries
-         * set by each other.
-         */
-        $this->assertTrue($cache1->contains('key1'));
-        $this->assertTrue($cache1->contains('key2'));
-        $this->assertTrue($cache2->contains('key1'));
-        $this->assertTrue($cache2->contains('key2'));
-
-        /* Flushing all entries through one cache will remove all entries from
-         * the cache but leave their namespace version as-is.
-         */
-        $this->assertTrue($cache1->flushAll());
-        $this->assertFalse($cache1->contains('key1'));
-        $this->assertFalse($cache1->contains('key2'));
-        $this->assertFalse($cache2->contains('key1'));
-        $this->assertFalse($cache2->contains('key2'));
-
-        /* Inserting a new entry will use the same, incremented namespace
-         * version, and it will be visible to both providers.
-         */
-        $this->assertTrue($cache1->save('key1', 1));
-        $this->assertTrue($cache1->contains('key1'));
-        $this->assertTrue($cache2->contains('key1'));
-
-        /* A new cache provider will be initialized with the original namespace
-         * version and not share any visibility with the first two providers.
-         */
-        $cache3 = $this->_getCacheDriver();
-        $this->assertFalse($cache3->contains('key1'));
-        $this->assertFalse($cache3->contains('key2'));
-        $this->assertTrue($cache3->save('key3', 3));
-        $this->assertTrue($cache3->contains('key3'));
-    }
-
-    public function testNamespace()
-    {
-        $cache = $this->_getCacheDriver();
-
-        $cache->setNamespace('ns1_');
-
-        $this->assertTrue($cache->save('key1', 1));
-        $this->assertTrue($cache->contains('key1'));
-
-        $cache->setNamespace('ns2_');
-
-        $this->assertFalse($cache->contains('key1'));
-    }
-
-    public function testDeleteAllNamespace()
-    {
-        $cache = $this->_getCacheDriver();
-
-        $cache->setNamespace('ns1');
-        $this->assertFalse($cache->contains('key1'));
-        $cache->save('key1', 'test');
-        $this->assertTrue($cache->contains('key1'));
-
-        $cache->setNamespace('ns2');
-        $this->assertFalse($cache->contains('key1'));
-        $cache->save('key1', 'test');
-        $this->assertTrue($cache->contains('key1'));
-
-        $cache->setNamespace('ns1');
-        $this->assertTrue($cache->contains('key1'));
-        $cache->deleteAll();
-        $this->assertFalse($cache->contains('key1'));
-
-        $cache->setNamespace('ns2');
-        $this->assertTrue($cache->contains('key1'));
-        $cache->deleteAll();
-        $this->assertFalse($cache->contains('key1'));
-    }
-
-    /**
-     * @group DCOM-43
-     */
-    public function testGetStats()
-    {
-        $cache = $this->_getCacheDriver();
-        $stats = $cache->getStats();
-
-        $this->assertArrayHasKey(Cache::STATS_HITS, $stats);
-        $this->assertArrayHasKey(Cache::STATS_MISSES, $stats);
-        $this->assertArrayHasKey(Cache::STATS_UPTIME, $stats);
-        $this->assertArrayHasKey(Cache::STATS_MEMORY_USAGE, $stats);
-        $this->assertArrayHasKey(Cache::STATS_MEMORY_AVAILABLE, $stats);
-    }
-
-    public function testFetchMissShouldReturnFalse()
-    {
-        $cache = $this->_getCacheDriver();
-
-        /* Ensure that caches return boolean false instead of null on a fetch
-         * miss to be compatible with ORM integration.
-         */
-        $result = $cache->fetch('nonexistent_key');
-
-        $this->assertFalse($result);
-        $this->assertNotNull($result);
-    }
-
-    /**
-     * Check to see that objects are correctly serialized and unserialized by the cache
-     * provider.
-     */
-    public function testCachedObject()
-    {
-        $cache = $this->_getCacheDriver();
-        $cache->deleteAll();
-        $obj = new \stdClass();
-        $obj->foo = "bar";
-        $obj2 = new \stdClass();
-        $obj2->bar = "foo";
-        $obj2->obj = $obj;
-        $obj->obj2 = $obj2;
-        $cache->save("obj", $obj);
-
-        $fetched = $cache->fetch("obj");
-
-        $this->assertInstanceOf("stdClass", $obj);
-        $this->assertInstanceOf("stdClass", $obj->obj2);
-        $this->assertInstanceOf("stdClass", $obj->obj2->obj);
-        $this->assertEquals("bar", $fetched->foo);
-        $this->assertEquals("foo", $fetched->obj2->bar);
-    }
-
-    /**
-     * Check to see that objects fetched via fetchMultiple are properly unserialized
-     */
-    public function testFetchMultipleObjects()
-    {
-        $cache = $this->_getCacheDriver();
-        $cache->deleteAll();
-        $obj1 = new \stdClass();
-        $obj1->foo = "bar";
-        $cache->save("obj1", $obj1);
-        $obj2 = new \stdClass();
-        $obj2->bar = "baz";
-        $cache->save("obj2", $obj2);
-
-        $fetched = $cache->fetchMultiple(array("obj1", "obj2"));
-        $this->assertInstanceOf("stdClass", $fetched["obj1"]);
-        $this->assertInstanceOf("stdClass", $fetched["obj2"]);
-        $this->assertEquals("bar", $fetched["obj1"]->foo);
-        $this->assertEquals("baz", $fetched["obj2"]->bar);
-    }
-
-    /**
-     * Return whether multiple cache providers share the same storage.
-     *
-     * This is used for skipping certain tests for shared storage behavior.
-     *
-     * @return boolean
-     */
-    protected function isSharedStorage()
-    {
-        return true;
-    }
-
-    /**
-     * @return \Doctrine\Common\Cache\CacheProvider
-     */
-    abstract protected function _getCacheDriver();
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ChainCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ChainCacheTest.php
deleted file mode 100644
index 46d78c1..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ChainCacheTest.php
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\ApcCache;
-use Doctrine\Common\Cache\ArrayCache;
-use Doctrine\Common\Cache\ChainCache;
-
-class ChainCacheTest extends CacheTest
-{
-    protected function _getCacheDriver()
-    {
-        return new ChainCache(array(new ArrayCache()));
-    }
-
-    public function testGetStats()
-    {
-        $cache = $this->_getCacheDriver();
-        $stats = $cache->getStats();
-
-        $this->assertInternalType('array', $stats);
-    }
-
-    public function testOnlyFetchFirstOne()
-    {
-        $cache1 = new ArrayCache();
-        $cache2 = $this->getMockForAbstractClass('Doctrine\Common\Cache\CacheProvider');
-
-        $cache2->expects($this->never())->method('doFetch');
-
-        $chainCache = new ChainCache(array($cache1, $cache2));
-        $chainCache->save('id', 'bar');
-
-        $this->assertEquals('bar', $chainCache->fetch('id'));
-    }
-
-    public function testFetchPropagateToFastestCache()
-    {
-        $cache1 = new ArrayCache();
-        $cache2 = new ArrayCache();
-
-        $cache2->save('bar', 'value');
-
-        $chainCache = new ChainCache(array($cache1, $cache2));
-
-        $this->assertFalse($cache1->contains('bar'));
-
-        $result = $chainCache->fetch('bar');
-
-        $this->assertEquals('value', $result);
-        $this->assertTrue($cache2->contains('bar'));
-    }
-
-    public function testNamespaceIsPropagatedToAllProviders()
-    {
-        $cache1 = new ArrayCache();
-        $cache2 = new ArrayCache();
-
-        $chainCache = new ChainCache(array($cache1, $cache2));
-        $chainCache->setNamespace('bar');
-
-        $this->assertEquals('bar', $cache1->getNamespace());
-        $this->assertEquals('bar', $cache2->getNamespace());
-    }
-
-    public function testDeleteToAllProviders()
-    {
-        $cache1 = $this->getMockForAbstractClass('Doctrine\Common\Cache\CacheProvider');
-        $cache2 = $this->getMockForAbstractClass('Doctrine\Common\Cache\CacheProvider');
-
-        $cache1->expects($this->once())->method('doDelete');
-        $cache2->expects($this->once())->method('doDelete');
-
-        $chainCache = new ChainCache(array($cache1, $cache2));
-        $chainCache->delete('bar');
-    }
-
-    public function testFlushToAllProviders()
-    {
-        $cache1 = $this->getMockForAbstractClass('Doctrine\Common\Cache\CacheProvider');
-        $cache2 = $this->getMockForAbstractClass('Doctrine\Common\Cache\CacheProvider');
-
-        $cache1->expects($this->once())->method('doFlush');
-        $cache2->expects($this->once())->method('doFlush');
-
-        $chainCache = new ChainCache(array($cache1, $cache2));
-        $chainCache->flushAll();
-    }
-
-    protected function isSharedStorage()
-    {
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CouchbaseCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CouchbaseCacheTest.php
deleted file mode 100644
index 40d5a69..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/CouchbaseCacheTest.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Couchbase;
-use Doctrine\Common\Cache\CouchbaseCache;
-
-class CouchbaseCacheTest extends CacheTest
-{
-    private $couchbase;
-
-    public function setUp()
-    {
-        if (extension_loaded('couchbase')) {
-            try {
-                $this->couchbase = new Couchbase('127.0.0.1', 'Administrator', 'password', 'default');
-            } catch(Exception $ex) {
-                 $this->markTestSkipped('Could not instantiate the Couchbase cache because of: ' . $ex);   
-            }
-        } else {
-            $this->markTestSkipped('The ' . __CLASS__ .' requires the use of the couchbase extension');
-        }
-    }
-
-    public function testNoExpire() 
-    {
-        $cache = $this->_getCacheDriver();
-        $cache->save('noexpire', 'value', 0);
-        sleep(1);
-        $this->assertTrue($cache->contains('noexpire'), 'Couchbase provider should support no-expire');
-    }
-
-    public function testLongLifetime()
-    {
-        $cache = $this->_getCacheDriver();
-        $cache->save('key', 'value', 30 * 24 * 3600 + 1);
-
-        $this->assertTrue($cache->contains('key'), 'Couchbase provider should support TTL > 30 days');
-    }
-
-    protected function _getCacheDriver()
-    {
-        $driver = new CouchbaseCache();
-        $driver->setCouchbase($this->couchbase);
-        return $driver;
-    }
-}
\ No newline at end of file
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FileCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FileCacheTest.php
deleted file mode 100644
index 2bfca26..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FileCacheTest.php
+++ /dev/null
@@ -1,161 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\Cache;
-
-/**
- * @group DCOM-101
- */
-class FileCacheTest extends \Doctrine\Tests\DoctrineTestCase
-{
-    /**
-     * @var \Doctrine\Common\Cache\FileCache
-     */
-    private $driver;
-
-    protected function setUp()
-    {
-        $this->driver = $this->getMock(
-            'Doctrine\Common\Cache\FileCache',
-            array('doFetch', 'doContains', 'doSave'),
-            array(), '', false
-        );
-    }
-
-    public function getProviderFileName()
-    {
-         return array(
-            //The characters :\/<>"*?| are not valid in Windows filenames.
-            array('key:1', 'key-1'),
-            array('key\2', 'key-2'),
-            array('key/3', 'key-3'),
-            array('key<4', 'key-4'),
-            array('key>5', 'key-5'),
-            array('key"6', 'key-6'),
-            array('key*7', 'key-7'),
-            array('key?8', 'key-8'),
-            array('key|9', 'key-9'),
-            array('key[10]', 'key[10]'),
-            array('keyä11', 'key--11'),
-            array('../key12', '---key12'),
-            array('key-13', 'key__13'),
-        );
-    }
-
-    /**
-     * @dataProvider getProviderFileName
-     */
-    public function testInvalidFilename($key, $expected)
-    {
-        $cache  = $this->driver;
-        $method = new \ReflectionMethod($cache, 'getFilename');
-
-        $method->setAccessible(true);
-
-        $value  = $method->invoke($cache, $key);
-        $actual = pathinfo($value, PATHINFO_FILENAME);
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testFilenameCollision()
-    {
-        $data = array(
-            'key:0' => 'key-0',
-            'key\0' => 'key-0',
-            'key/0' => 'key-0',
-            'key<0' => 'key-0',
-            'key>0' => 'key-0',
-            'key"0' => 'key-0',
-            'key*0' => 'key-0',
-            'key?0' => 'key-0',
-            'key|0' => 'key-0',
-            'key-0' => 'key__0',
-            'keyä0' => 'key--0',
-        );
-
-        $paths  = array();
-        $cache  = $this->driver;
-        $method = new \ReflectionMethod($cache, 'getFilename');
-
-        $method->setAccessible(true);
-
-        foreach ($data as $key => $expected) {
-            $path   = $method->invoke($cache, $key);
-            $actual = pathinfo($path, PATHINFO_FILENAME);
-
-            $this->assertNotContains($path, $paths);
-            $this->assertEquals($expected, $actual);
-
-            $paths[] = $path;
-        }
-    }
-
-    public function testFilenameShouldCreateThePathWithFourSubDirectories()
-    {
-        $cache          = $this->driver;
-        $method         = new \ReflectionMethod($cache, 'getFilename');
-        $key            = 'item-key';
-        $expectedDir    = array(
-            '84', 'e0', 'e2', 'e8', '93', 'fe', 'bb', '73', '7a', '0f', 'ee',
-            '0c', '89', 'd5', '3f', '4b', 'b7', 'fc', 'b4', '4c', '57', 'cd',
-            'f3', 'd3', '2c', 'e7', '36', '3f', '5d', '59', '77', '60'
-        );
-        $expectedDir    = implode(DIRECTORY_SEPARATOR, $expectedDir);
-
-        $method->setAccessible(true);
-
-        $path       = $method->invoke($cache, $key);
-        $filename   = pathinfo($path, PATHINFO_FILENAME);
-        $dirname    = pathinfo($path, PATHINFO_DIRNAME);
-
-        $this->assertEquals('item__key', $filename);
-        $this->assertEquals(DIRECTORY_SEPARATOR . $expectedDir, $dirname);
-        $this->assertEquals(DIRECTORY_SEPARATOR . $expectedDir . DIRECTORY_SEPARATOR . 'item__key', $path);
-    }
-
-    public function testFileExtensionCorrectlyEscaped()
-    {
-        $driver1 = $this->getMock(
-            'Doctrine\Common\Cache\FileCache',
-            array('doFetch', 'doContains', 'doSave'),
-            array(__DIR__, '.*')
-        );
-        $driver2 = $this->getMock(
-            'Doctrine\Common\Cache\FileCache',
-            array('doFetch', 'doContains', 'doSave'),
-            array(__DIR__, '.php')
-        );
-
-        $doGetStats = new \ReflectionMethod($driver1, 'doGetStats');
-
-        $doGetStats->setAccessible(true);
-
-        $stats1 = $doGetStats->invoke($driver1);
-        $stats2 = $doGetStats->invoke($driver2);
-
-        $this->assertSame(0, $stats1[Cache::STATS_MEMORY_USAGE]);
-        $this->assertGreaterThan(0, $stats2[Cache::STATS_MEMORY_USAGE]);
-    }
-
-    /**
-     * @group DCOM-266
-     */
-    public function testFileExtensionSlashCorrectlyEscaped()
-    {
-        $driver = $this->getMock(
-            'Doctrine\Common\Cache\FileCache',
-            array('doFetch', 'doContains', 'doSave'),
-            array(__DIR__ . '/../', DIRECTORY_SEPARATOR . basename(__FILE__))
-        );
-
-        $doGetStats = new \ReflectionMethod($driver, 'doGetStats');
-
-        $doGetStats->setAccessible(true);
-
-        $stats = $doGetStats->invoke($driver);
-
-        $this->assertGreaterThan(0, $stats[Cache::STATS_MEMORY_USAGE]);
-    }
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FilesystemCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FilesystemCacheTest.php
deleted file mode 100644
index 32250fa..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/FilesystemCacheTest.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\Cache;
-use Doctrine\Common\Cache\FilesystemCache;
-
-/**
- * @group DCOM-101
- */
-class FilesystemCacheTest extends BaseFileCacheTest
-{
-    public function testLifetime()
-    {
-        $cache = $this->_getCacheDriver();
-
-        // Test save
-        $cache->save('test_key', 'testing this out', 10);
-
-        // Test contains to test that save() worked
-        $this->assertTrue($cache->contains('test_key'));
-
-        // Test fetch
-        $this->assertEquals('testing this out', $cache->fetch('test_key'));
-
-        // access private methods
-        $getFilename        = new \ReflectionMethod($cache, 'getFilename');
-        $getNamespacedId    = new \ReflectionMethod($cache, 'getNamespacedId');
-
-        $getFilename->setAccessible(true);
-        $getNamespacedId->setAccessible(true);
-
-        $id         = $getNamespacedId->invoke($cache, 'test_key');
-        $filename   = $getFilename->invoke($cache, $id);
-
-        $data       = '';
-        $lifetime   = 0;
-        $resource   = fopen($filename, "r");
-
-        if (false !== ($line = fgets($resource))) {
-            $lifetime = (integer) $line;
-        }
-
-        while (false !== ($line = fgets($resource))) {
-            $data .= $line;
-        }
-
-        $this->assertNotEquals(0, $lifetime, 'previous lifetime could not be loaded');
-
-        // update lifetime
-        $lifetime = $lifetime - 20;
-        file_put_contents($filename, $lifetime . PHP_EOL . $data);
-
-        // test expired data
-        $this->assertFalse($cache->contains('test_key'));
-        $this->assertFalse($cache->fetch('test_key'));
-    }
-
-    public function testGetStats()
-    {
-        $cache = $this->_getCacheDriver();
-        $stats = $cache->getStats();
-
-        $this->assertNull($stats[Cache::STATS_HITS]);
-        $this->assertNull($stats[Cache::STATS_MISSES]);
-        $this->assertNull($stats[Cache::STATS_UPTIME]);
-        $this->assertEquals(0, $stats[Cache::STATS_MEMORY_USAGE]);
-        $this->assertGreaterThan(0, $stats[Cache::STATS_MEMORY_AVAILABLE]);
-    }
-
-    public function testCacheInSharedDirectoryIsPerExtension()
-    {
-        $cache1 = new FilesystemCache($this->directory, '.foo');
-        $cache2 = new FilesystemCache($this->directory, '.bar');
-
-        $this->assertTrue($cache1->save('key1', 11));
-        $this->assertTrue($cache1->save('key2', 12));
-
-        $this->assertTrue($cache2->save('key1', 21));
-        $this->assertTrue($cache2->save('key2', 22));
-
-        $this->assertSame(11, $cache1->fetch('key1'), 'Cache value must not be influenced by a different cache in the same directory but different extension');
-        $this->assertSame(12, $cache1->fetch('key2'));
-        $this->assertTrue($cache1->flushAll());
-        $this->assertFalse($cache1->fetch('key1'), 'flushAll() must delete all items with the current extension');
-        $this->assertFalse($cache1->fetch('key2'));
-
-        $this->assertSame(21, $cache2->fetch('key1'), 'flushAll() must not remove items with a different extension in a shared directory');
-        $this->assertSame(22, $cache2->fetch('key2'));
-    }
-
-    public function testFlushAllWithNoExtension()
-    {
-        $cache = new FilesystemCache($this->directory, '');
-
-        $this->assertTrue($cache->save('key1', 1));
-        $this->assertTrue($cache->save('key2', 2));
-        $this->assertTrue($cache->flushAll());
-        $this->assertFalse($cache->contains('key1'));
-        $this->assertFalse($cache->contains('key2'));
-    }
-
-    protected function _getCacheDriver()
-    {
-        return new FilesystemCache($this->directory);
-    }
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php
deleted file mode 100644
index b0da1b9..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\MemcacheCache;
-use Memcache;
-
-class MemcacheCacheTest extends CacheTest
-{
-    private $memcache;
-
-    public function setUp()
-    {
-        if ( ! extension_loaded('memcache')) {
-            $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache');
-        }
-
-        $this->memcache = new Memcache();
-
-        if (@$this->memcache->connect('localhost', 11211) === false) {
-            unset($this->memcache);
-            $this->markTestSkipped('The ' . __CLASS__ .' cannot connect to memcache');
-        }
-    }
-
-    public function tearDown()
-    {
-        if ($this->memcache instanceof Memcache) {
-            $this->memcache->flush();
-        }
-    }
-
-    public function testNoExpire()
-    {
-        $cache = $this->_getCacheDriver();
-        $cache->save('noexpire', 'value', 0);
-        sleep(1);
-        $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire');
-    }
-
-    public function testLongLifetime()
-    {
-        $cache = $this->_getCacheDriver();
-        $cache->save('key', 'value', 30 * 24 * 3600 + 1);
-        $this->assertTrue($cache->contains('key'), 'Memcache provider should support TTL > 30 days');
-    }
-
-    protected function _getCacheDriver()
-    {
-        $driver = new MemcacheCache();
-        $driver->setMemcache($this->memcache);
-        return $driver;
-    }
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php
deleted file mode 100644
index 071329f..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\MemcachedCache;
-use Memcached;
-
-class MemcachedCacheTest extends CacheTest
-{
-    private $memcached;
-
-    public function setUp()
-    {
-        if ( ! extension_loaded('memcached')) {
-            $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcached');
-        }
-
-        $this->memcached = new Memcached();
-        $this->memcached->setOption(Memcached::OPT_COMPRESSION, false);
-        $this->memcached->addServer('127.0.0.1', 11211);
-
-        if (@fsockopen('127.0.0.1', 11211) === false) {
-            unset($this->memcached);
-            $this->markTestSkipped('The ' . __CLASS__ .' cannot connect to memcache');
-        }
-    }
-
-    public function tearDown()
-    {
-        if ($this->memcached instanceof Memcached) {
-            $this->memcached->flush();
-        }
-    }
-
-    public function testNoExpire()
-    {
-        $cache = $this->_getCacheDriver();
-        $cache->save('noexpire', 'value', 0);
-        sleep(1);
-        $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire');
-    }
-
-    public function testLongLifetime()
-    {
-        $cache = $this->_getCacheDriver();
-        $cache->save('key', 'value', 30 * 24 * 3600 + 1);
-        $this->assertTrue($cache->contains('key'), 'Memcache provider should support TTL > 30 days');
-    }
-
-    protected function _getCacheDriver()
-    {
-        $driver = new MemcachedCache();
-        $driver->setMemcached($this->memcached);
-        return $driver;
-    }
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MongoDBCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MongoDBCacheTest.php
deleted file mode 100644
index 8c2f6e0..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/MongoDBCacheTest.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\Cache;
-use Doctrine\Common\Cache\MongoDBCache;
-use MongoClient;
-use MongoCollection;
-
-class MongoDBCacheTest extends CacheTest
-{
-    /**
-     * @var MongoCollection
-     */
-    private $collection;
-
-    public function setUp()
-    {
-        if ( ! version_compare(phpversion('mongo'), '1.3.0', '>=')) {
-            $this->markTestSkipped('The ' . __CLASS__ .' requires the use of mongo >= 1.3.0');
-        }
-
-        $mongo = new MongoClient();
-        $this->collection = $mongo->selectCollection('doctrine_common_cache', 'test');
-    }
-
-    public function tearDown()
-    {
-        if ($this->collection instanceof MongoCollection) {
-            $this->collection->drop();
-        }
-    }
-
-    public function testSaveWithNonUtf8String()
-    {
-        // Invalid 2-octet sequence
-        $data = "\xc3\x28";
-
-        $cache = $this->_getCacheDriver();
-
-        $this->assertTrue($cache->save('key', $data));
-        $this->assertEquals($data, $cache->fetch('key'));
-    }
-
-    public function testGetStats()
-    {
-        $cache = $this->_getCacheDriver();
-        $stats = $cache->getStats();
-
-        $this->assertNull($stats[Cache::STATS_HITS]);
-        $this->assertNull($stats[Cache::STATS_MISSES]);
-        $this->assertGreaterThan(0, $stats[Cache::STATS_UPTIME]);
-        $this->assertEquals(0, $stats[Cache::STATS_MEMORY_USAGE]);
-        $this->assertNull($stats[Cache::STATS_MEMORY_AVAILABLE]);
-    }
-
-    protected function _getCacheDriver()
-    {
-        return new MongoDBCache($this->collection);
-    }
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PhpFileCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PhpFileCacheTest.php
deleted file mode 100644
index 940ed52..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PhpFileCacheTest.php
+++ /dev/null
@@ -1,179 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\Cache;
-use Doctrine\Common\Cache\PhpFileCache;
-
-/**
- * @group DCOM-101
- */
-class PhpFileCacheTest extends BaseFileCacheTest
-{
-    /**
-     * {@inheritDoc}
-     *
-     * @dataProvider provideDataToCache
-     */
-    public function testSetContainsFetchDelete($value)
-    {
-        if (is_object($value) && ! method_exists($value, '__set_state')) {
-            $this->markTestSkipped('PhpFileCache only allows objects that implement __set_state() and fully support var_export()');
-        }
-
-        if (0.0 === $value) {
-            $cache = $this->_getCacheDriver();
-
-            $this->assertTrue($cache->save('key', $value));
-            $this->assertTrue($cache->contains('key'));
-            $this->assertSame(0, $cache->fetch('key'), 'var_export exports float(0) as int(0) so we assert against 0 as integer');
-
-            $this->assertTrue($cache->delete('key'));
-            $this->assertFalse($cache->contains('key'));
-            $this->assertFalse($cache->fetch('key'));
-        } else {
-            parent::testSetContainsFetchDelete($value);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @dataProvider provideDataToCache
-     */
-    public function testUpdateExistingEntry($value)
-    {
-        if (is_object($value) && ! method_exists($value, '__set_state')) {
-            $this->markTestSkipped('PhpFileCache only allows objects that implement __set_state() and fully support var_export()');
-        }
-
-        if (0.0 === $value) {
-            $cache = $this->_getCacheDriver();
-
-            $this->assertTrue($cache->save('key', 'old-value'));
-            $this->assertTrue($cache->contains('key'));
-
-            $this->assertTrue($cache->save('key', $value));
-            $this->assertTrue($cache->contains('key'));
-            $this->assertSame(0, $cache->fetch('key'), 'var_export exports float(0) as int(0) so we assert against 0 as integer');
-        } else {
-            parent::testUpdateExistingEntry($value);
-        }
-    }
-
-    public function testLifetime()
-    {
-        $cache = $this->_getCacheDriver();
-
-        // Test save
-        $cache->save('test_key', 'testing this out', 10);
-
-        // Test contains to test that save() worked
-        $this->assertTrue($cache->contains('test_key'));
-
-        // Test fetch
-        $this->assertEquals('testing this out', $cache->fetch('test_key'));
-
-        // access private methods
-        $getFilename        = new \ReflectionMethod($cache, 'getFilename');
-        $getNamespacedId    = new \ReflectionMethod($cache, 'getNamespacedId');
-
-        $getFilename->setAccessible(true);
-        $getNamespacedId->setAccessible(true);
-
-        $id     = $getNamespacedId->invoke($cache, 'test_key');
-        $path   = $getFilename->invoke($cache, $id);
-        $value  = include $path;
-
-        // update lifetime
-        $value['lifetime'] = $value['lifetime'] - 20;
-        file_put_contents($path, '<?php return unserialize(' . var_export(serialize($value), true) . ');');
-
-        // test expired data
-        $this->assertFalse($cache->contains('test_key'));
-        $this->assertFalse($cache->fetch('test_key'));
-    }
-
-    public function testImplementsSetState()
-    {
-        $cache = $this->_getCacheDriver();
-
-        // Test save
-        $cache->save('test_set_state', new SetStateClass(array(1,2,3)));
-
-        //Test __set_state call
-        $this->assertCount(0, SetStateClass::$values);
-
-        // Test fetch
-        $value = $cache->fetch('test_set_state');
-        $this->assertInstanceOf('Doctrine\Tests\Common\Cache\SetStateClass', $value);
-        $this->assertEquals(array(1,2,3), $value->getValue());
-
-        //Test __set_state call
-        $this->assertCount(1, SetStateClass::$values);
-
-        // Test contains
-        $this->assertTrue($cache->contains('test_set_state'));
-    }
-
-    public function testNotImplementsSetState()
-    {
-        $cache = $this->_getCacheDriver();
-
-        $this->setExpectedException('InvalidArgumentException');
-        $cache->save('test_not_set_state', new NotSetStateClass(array(1,2,3)));
-    }
-
-    public function testGetStats()
-    {
-        $cache = $this->_getCacheDriver();
-        $stats = $cache->getStats();
-
-        $this->assertNull($stats[Cache::STATS_HITS]);
-        $this->assertNull($stats[Cache::STATS_MISSES]);
-        $this->assertNull($stats[Cache::STATS_UPTIME]);
-        $this->assertEquals(0, $stats[Cache::STATS_MEMORY_USAGE]);
-        $this->assertGreaterThan(0, $stats[Cache::STATS_MEMORY_AVAILABLE]);
-    }
-
-    public function testCachedObject()
-    {
-        $this->markTestSkipped("PhpFileCache cannot handle objects that don't implement __set_state.");
-    }
-
-    public function testFetchMultipleObjects()
-    {
-        $this->markTestSkipped("PhpFileCache cannot handle objects that don't implement __set_state.");
-    }
-
-    protected function _getCacheDriver()
-    {
-        return new PhpFileCache($this->directory);
-    }
-}
-
-class NotSetStateClass
-{
-    private $value;
-
-    public function __construct($value)
-    {
-        $this->value = $value;
-    }
-
-    public function getValue()
-    {
-        return $this->value;
-    }
-}
-
-class SetStateClass extends NotSetStateClass
-{
-    public static $values = array();
-
-    public static function __set_state($data)
-    {
-        self::$values = $data;
-        return new self($data['value']);
-    }
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PredisCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PredisCacheTest.php
deleted file mode 100644
index 58395f2..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/PredisCacheTest.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\Cache;
-use Doctrine\Common\Cache\PredisCache;
-use Predis\Client;
-use Predis\Connection\ConnectionException;
-
-class PredisCacheTest extends CacheTest
-{
-    private $client;
-
-    public function setUp()
-    {
-        if (!class_exists('Predis\Client')) {
-            $this->markTestSkipped('Predis\Client is missing. Make sure to "composer install" to have all dev dependencies.');
-        }
-
-        $this->client = new Client();
-
-        try {
-            $this->client->connect();
-        } catch (ConnectionException $e) {
-            $this->markTestSkipped('The ' . __CLASS__ .' requires the use of redis');
-        }
-    }
-
-    public function testHitMissesStatsAreProvided()
-    {
-        $cache = $this->_getCacheDriver();
-        $stats = $cache->getStats();
-
-        $this->assertNotNull($stats[Cache::STATS_HITS]);
-        $this->assertNotNull($stats[Cache::STATS_MISSES]);
-    }
-
-    /**
-     * @return PredisCache
-     */
-    protected function _getCacheDriver()
-    {
-        return new PredisCache($this->client);
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @dataProvider provideDataToCache
-     */
-    public function testSetContainsFetchDelete($value)
-    {
-        if (array() === $value) {
-            $this->markTestIncomplete(
-                'Predis currently doesn\'t support saving empty array values. '
-                . 'See https://github.com/nrk/predis/issues/241'
-            );
-        }
-
-        parent::testSetContainsFetchDelete($value);
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @dataProvider provideDataToCache
-     */
-    public function testUpdateExistingEntry($value)
-    {
-        if (array() === $value) {
-            $this->markTestIncomplete(
-                'Predis currently doesn\'t support saving empty array values. '
-                . 'See https://github.com/nrk/predis/issues/241'
-            );
-        }
-
-        parent::testUpdateExistingEntry($value);
-    }
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RedisCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RedisCacheTest.php
deleted file mode 100644
index 35d9f5e..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RedisCacheTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\RedisCache;
-use Doctrine\Common\Cache\Cache;
-
-class RedisCacheTest extends CacheTest
-{
-    private $_redis;
-
-    public function setUp()
-    {
-        if (extension_loaded('redis')) {
-            $this->_redis = new \Redis();
-            $ok = @$this->_redis->connect('127.0.0.1');
-            if (!$ok) {
-                $this->markTestSkipped('The ' . __CLASS__ .' requires the use of redis');
-            }
-        } else {
-            $this->markTestSkipped('The ' . __CLASS__ .' requires the use of redis');
-        }
-    }
-
-    public function testHitMissesStatsAreProvided()
-    {
-        $cache = $this->_getCacheDriver();
-        $stats = $cache->getStats();
-
-        $this->assertNotNull($stats[Cache::STATS_HITS]);
-        $this->assertNotNull($stats[Cache::STATS_MISSES]);
-    }
-
-    protected function _getCacheDriver()
-    {
-        $driver = new RedisCache();
-        $driver->setRedis($this->_redis);
-        return $driver;
-    }
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RiakCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RiakCacheTest.php
deleted file mode 100644
index dce8cc0..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/RiakCacheTest.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Riak\Bucket;
-use Riak\Connection;
-use Riak\Exception;
-use Doctrine\Common\Cache\RiakCache;
-
-/**
- * RiakCache test
- *
- * @group Riak
- */
-class RiakCacheTest extends CacheTest
-{
-    /**
-     * @var \Riak\Connection
-     */
-    private $connection;
-
-    /**
-     * @var \Riak\Bucket
-     */
-    private $bucket;
-
-    /**
-     * {@inheritdoc}
-     */
-    public function setUp()
-    {
-        if ( ! extension_loaded('riak')) {
-            $this->markTestSkipped('The ' . __CLASS__ .' requires the use of Riak');
-        }
-
-        try {
-            $this->connection = new Connection('127.0.0.1', 8087);
-            $this->bucket     = new Bucket($this->connection, 'test');
-        } catch (Exception\RiakException $e) {
-            $this->markTestSkipped('The ' . __CLASS__ .' requires the use of Riak');
-        }
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function testGetStats()
-    {
-        $cache = $this->_getCacheDriver();
-        $stats = $cache->getStats();
-
-        $this->assertNull($stats);
-    }
-
-    /**
-     * Retrieve RiakCache instance.
-     *
-     * @return \Doctrine\Common\Cache\RiakCache
-     */
-    protected function _getCacheDriver()
-    {
-        return new RiakCache($this->bucket);
-    }
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/SQLite3CacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/SQLite3CacheTest.php
deleted file mode 100644
index f55d8a3..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/SQLite3CacheTest.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\Cache;
-use Doctrine\Common\Cache\SQLite3Cache;
-use SQLite3;
-
-class SQLite3Test extends CacheTest
-{
-    /**
-     * @var SQLite3
-     */
-    private $file, $sqlite;
-
-    protected function setUp()
-    {
-        if ( ! extension_loaded('sqlite3')) {
-            $this->markTestSkipped('The ' . __CLASS__ .' requires the use of SQLite3');
-        }
-
-        $this->file = tempnam(null, 'doctrine-cache-test-');
-        unlink($this->file);
-        $this->sqlite = new SQLite3($this->file);
-    }
-
-    protected function tearDown()
-    {
-        $this->sqlite = null;  // DB must be closed before
-        unlink($this->file);
-    }
-
-    public function testGetStats()
-    {
-        $this->assertNull($this->_getCacheDriver()->getStats());
-    }
-
-    public function testFetchSingle()
-    {
-        $id   = uniqid('sqlite3_id_');
-        $data = "\0"; // produces null bytes in serialized format
-
-        $this->_getCacheDriver()->save($id, $data, 30);
-
-        $this->assertEquals($data, $this->_getCacheDriver()->fetch($id));
-    }
-
-    protected function _getCacheDriver()
-    {
-        return new SQLite3Cache($this->sqlite, 'test_table');
-    }
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/VoidCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/VoidCacheTest.php
deleted file mode 100644
index ca87f16..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/VoidCacheTest.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\VoidCache;
-
-/**
- * @covers \Doctrine\Common\Cache\VoidCache
- */
-class VoidCacheTest extends \PHPUnit_Framework_TestCase
-{
-    public function testShouldAlwaysReturnFalseOnContains()
-    {
-        $cache = new VoidCache();
-
-        $this->assertFalse($cache->contains('foo'));
-        $this->assertFalse($cache->contains('bar'));
-    }
-
-    public function testShouldAlwaysReturnFalseOnFetch()
-    {
-        $cache = new VoidCache();
-
-        $this->assertFalse($cache->fetch('foo'));
-        $this->assertFalse($cache->fetch('bar'));
-    }
-
-    public function testShouldAlwaysReturnTrueOnSaveButNotStoreAnything()
-    {
-        $cache = new VoidCache();
-
-        $this->assertTrue($cache->save('foo', 'fooVal'));
-
-        $this->assertFalse($cache->contains('foo'));
-        $this->assertFalse($cache->fetch('foo'));
-    }
-
-    public function testShouldAlwaysReturnTrueOnDelete()
-    {
-        $cache = new VoidCache();
-
-        $this->assertTrue($cache->delete('foo'));
-    }
-
-    public function testShouldAlwaysReturnNullOnGetStatus()
-    {
-        $cache = new VoidCache();
-
-        $this->assertNull($cache->getStats());
-    }
-}
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php
deleted file mode 100644
index cb363df..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\WincacheCache;
-
-class WincacheCacheTest extends CacheTest
-{
-    public function setUp()
-    {
-        if ( ! extension_loaded('wincache') || ! function_exists('wincache_ucache_info')) {
-            $this->markTestSkipped('The ' . __CLASS__ .' requires the use of Wincache');
-        }
-    }
-
-    protected function _getCacheDriver()
-    {
-        return new WincacheCache();
-    }
-}
\ No newline at end of file
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php
deleted file mode 100644
index 6259848..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\XcacheCache;
-
-class XcacheCacheTest extends CacheTest
-{
-    public function setUp()
-    {
-        if ( ! extension_loaded('xcache')) {
-            $this->markTestSkipped('The ' . __CLASS__ .' requires the use of xcache');
-        }
-    }
-
-    protected function _getCacheDriver()
-    {
-        return new XcacheCache();
-    }
-}
\ No newline at end of file
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php b/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php
deleted file mode 100644
index cd66e15..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace Doctrine\Tests\Common\Cache;
-
-use Doctrine\Common\Cache\ZendDataCache;
-
-class ZendDataCacheTest extends CacheTest
-{
-    public function setUp()
-    {
-        if (!function_exists('zend_shm_cache_fetch') || (php_sapi_name() != 'apache2handler')) {
-            $this->markTestSkipped('The ' . __CLASS__ .' requires the use of Zend Data Cache which only works in apache2handler SAPI');
-        }
-    }
-
-    public function testGetStats()
-    {
-        $cache = $this->_getCacheDriver();
-        $stats = $cache->getStats();
-
-        $this->assertNull($stats);
-    }
-
-    protected function _getCacheDriver()
-    {
-        return new ZendDataCache();
-    }
-}
\ No newline at end of file
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/DoctrineTestCase.php b/vendor/doctrine/cache/tests/Doctrine/Tests/DoctrineTestCase.php
deleted file mode 100644
index e8323d2..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/DoctrineTestCase.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Doctrine\Tests;
-
-/**
- * Base testcase class for all Doctrine testcases.
- */
-abstract class DoctrineTestCase extends \PHPUnit_Framework_TestCase
-{
-}
\ No newline at end of file
diff --git a/vendor/doctrine/cache/tests/Doctrine/Tests/TestInit.php b/vendor/doctrine/cache/tests/Doctrine/Tests/TestInit.php
deleted file mode 100644
index 1bbfa94..0000000
--- a/vendor/doctrine/cache/tests/Doctrine/Tests/TestInit.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-/*
- * This file bootstraps the test environment.
- */
-error_reporting(E_ALL | E_STRICT);
-
-if (file_exists(__DIR__ . '/../../../vendor/autoload.php')) {
-    // dependencies were installed via composer - this is the main project
-    $classLoader = require __DIR__ . '/../../../vendor/autoload.php';
-} elseif (file_exists(__DIR__ . '/../../../../../autoload.php')) {
-    // installed as a dependency in `vendor`
-    $classLoader = require __DIR__ . '/../../../../../autoload.php';
-} else {
-    throw new Exception('Can\'t find autoload.php. Did you install dependencies via Composer?');
-}
-
-/* @var $classLoader \Composer\Autoload\ClassLoader */
-$classLoader->add('Doctrine\\Tests\\', __DIR__ . '/../../');
-unset($classLoader);
diff --git a/vendor/doctrine/cache/tests/travis/php.ini b/vendor/doctrine/cache/tests/travis/php.ini
deleted file mode 100644
index 105af36..0000000
--- a/vendor/doctrine/cache/tests/travis/php.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-extension="mongo.so"
-extension="memcache.so"
-extension="memcached.so"
-extension="redis.so"
-
-apc.enabled=1
-apc.enable_cli=1
diff --git a/vendor/doctrine/cache/tests/travis/phpunit.travis.xml b/vendor/doctrine/cache/tests/travis/phpunit.travis.xml
deleted file mode 100644
index a01faa5..0000000
--- a/vendor/doctrine/cache/tests/travis/phpunit.travis.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<phpunit bootstrap="../Doctrine/Tests/TestInit.php"
-        convertWarningsToExceptions="true"
-        convertNoticesToExceptions="true"
-        convertErrorsToExceptions="true"
-        backupStaticAttributes="false"
-        processIsolation="false"
-        stopOnFailure="false"
-        backupGlobals="false"
-        syntaxCheck="false"
-        colors="true">
-
-    <logging>
-        <log type="coverage-clover" target="../../build/logs/clover.xml"/>
-    </logging>
-
-    <testsuites>
-        <testsuite name="Doctrine Cache Test Suite">
-            <directory>../Doctrine/</directory>
-        </testsuite>
-    </testsuites>
-
-    <filter>
-        <whitelist>
-            <directory>../../lib/Doctrine/</directory>
-        </whitelist>
-    </filter>
-    
-    <groups>
-        <exclude>
-            <group>performance</group>
-        </exclude>
-    </groups>
-</phpunit>
diff --git a/vendor/guzzlehttp/guzzle/CHANGELOG.md b/vendor/guzzlehttp/guzzle/CHANGELOG.md
index 17badd7..6555749 100644
--- a/vendor/guzzlehttp/guzzle/CHANGELOG.md
+++ b/vendor/guzzlehttp/guzzle/CHANGELOG.md
@@ -1,5 +1,22 @@
 # Change Log
 
+## 6.4.1 - 2019-10-23
+
+* No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that 
+* Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar`
+
+## 6.4.0 - 2019-10-23
+
+* Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108)
+* Fix: Test if response is readable before returning a summary in `RequestException::getResponseBodySummary()` [#2081](https://github.com/guzzle/guzzle/pull/2081)
+* Fix: Add support for GUZZLE_CURL_SELECT_TIMEOUT environment variable [#2161](https://github.com/guzzle/guzzle/pull/2161)
+* Improvement: Added `GuzzleHttp\Exception\InvalidArgumentException` [#2163](https://github.com/guzzle/guzzle/pull/2163)
+* Improvement: Added `GuzzleHttp\_current_time()` to use `hrtime()` if that function exists. [#2242](https://github.com/guzzle/guzzle/pull/2242)
+* Improvement: Added curl's `appconnect_time` in `TransferStats` [#2284](https://github.com/guzzle/guzzle/pull/2284)
+* Improvement: Make GuzzleException extend Throwable wherever it's available [#2273](https://github.com/guzzle/guzzle/pull/2273)
+* Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335)
+* Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362)
+
 ## 6.3.3 - 2018-04-22
 
 * Fix: Default headers when decode_content is specified
diff --git a/vendor/guzzlehttp/guzzle/README.md b/vendor/guzzlehttp/guzzle/README.md
index bcd18b8..a5ef18a 100644
--- a/vendor/guzzlehttp/guzzle/README.md
+++ b/vendor/guzzlehttp/guzzle/README.md
@@ -21,19 +21,18 @@ trivial to integrate with web services.
 
 ```php
 $client = new \GuzzleHttp\Client();
-$res = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');
-echo $res->getStatusCode();
-// 200
-echo $res->getHeaderLine('content-type');
-// 'application/json; charset=utf8'
-echo $res->getBody();
-// '{"id": 1420053, "name": "guzzle", ...}'
-
-// Send an asynchronous request.
+$response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');
+
+echo $response->getStatusCode(); # 200
+echo $response->getHeaderLine('content-type'); # 'application/json; charset=utf8'
+echo $response->getBody(); # '{"id": 1420053, "name": "guzzle", ...}'
+
+# Send an asynchronous request.
 $request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org');
 $promise = $client->sendAsync($request)->then(function ($response) {
     echo 'I completed! ' . $response->getBody();
 });
+
 $promise->wait();
 ```
 
@@ -57,7 +56,7 @@ curl -sS https://getcomposer.org/installer | php
 Next, run the Composer command to install the latest stable version of Guzzle:
 
 ```bash
-php composer.phar require guzzlehttp/guzzle
+composer require guzzlehttp/guzzle
 ```
 
 After installing, you need to require Composer's autoloader:
@@ -69,7 +68,7 @@ require 'vendor/autoload.php';
 You can then later update Guzzle using composer:
 
  ```bash
-composer.phar update
+composer update
  ```
 
 
@@ -86,6 +85,6 @@ composer.phar update
 [guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x
 [guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3
 [guzzle-6-repo]: https://github.com/guzzle/guzzle
-[guzzle-3-docs]: http://guzzle3.readthedocs.org/en/latest/
+[guzzle-3-docs]: http://guzzle3.readthedocs.org
 [guzzle-5-docs]: http://guzzle.readthedocs.org/en/5.3/
 [guzzle-6-docs]: http://guzzle.readthedocs.org/en/latest/
diff --git a/vendor/guzzlehttp/guzzle/composer.json b/vendor/guzzlehttp/guzzle/composer.json
index 1f328e3..c553257 100644
--- a/vendor/guzzlehttp/guzzle/composer.json
+++ b/vendor/guzzlehttp/guzzle/composer.json
@@ -2,7 +2,15 @@
     "name": "guzzlehttp/guzzle",
     "type": "library",
     "description": "Guzzle is a PHP HTTP client library",
-    "keywords": ["framework", "http", "rest", "web service", "curl", "client", "HTTP client"],
+    "keywords": [
+        "framework",
+        "http",
+        "rest",
+        "web service",
+        "curl",
+        "client",
+        "HTTP client"
+    ],
     "homepage": "http://guzzlephp.org/",
     "license": "MIT",
     "authors": [
@@ -14,31 +22,37 @@
     ],
     "require": {
         "php": ">=5.5",
-        "guzzlehttp/psr7": "^1.4",
-        "guzzlehttp/promises": "^1.0"
+        "ext-json": "*",
+        "guzzlehttp/promises": "^1.0",
+        "guzzlehttp/psr7": "^1.6.1"
     },
     "require-dev": {
         "ext-curl": "*",
         "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
-        "psr/log": "^1.0"
+        "psr/log": "^1.1"
+    },
+    "suggest": {
+        "psr/log": "Required for using the Log middleware"
+    },
+    "config": {
+        "sort-packages": true
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "6.3-dev"
+        }
     },
     "autoload": {
-        "files": ["src/functions_include.php"],
         "psr-4": {
             "GuzzleHttp\\": "src/"
-        }
+        },
+        "files": [
+            "src/functions_include.php"
+        ]
     },
     "autoload-dev": {
         "psr-4": {
             "GuzzleHttp\\Tests\\": "tests/"
         }
-    },
-    "suggest": {
-        "psr/log": "Required for using the Log middleware"
-    },
-    "extra": {
-        "branch-alias": {
-            "dev-master": "6.3-dev"
-        }
     }
 }
diff --git a/vendor/guzzlehttp/guzzle/src/Client.php b/vendor/guzzlehttp/guzzle/src/Client.php
index 8041791..0f43c71 100644
--- a/vendor/guzzlehttp/guzzle/src/Client.php
+++ b/vendor/guzzlehttp/guzzle/src/Client.php
@@ -210,7 +210,7 @@ class Client implements ClientInterface
      *
      * @return array
      */
-    private function prepareDefaults($options)
+    private function prepareDefaults(array $options)
     {
         $defaults = $this->config;
 
diff --git a/vendor/guzzlehttp/guzzle/src/ClientInterface.php b/vendor/guzzlehttp/guzzle/src/ClientInterface.php
index 2dbcffa..5b37085 100644
--- a/vendor/guzzlehttp/guzzle/src/ClientInterface.php
+++ b/vendor/guzzlehttp/guzzle/src/ClientInterface.php
@@ -12,7 +12,7 @@ use Psr\Http\Message\UriInterface;
  */
 interface ClientInterface
 {
-    const VERSION = '6.3.3';
+    const VERSION = '6.4.1';
 
     /**
      * Send an HTTP request.
diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
index 78f2b79..2862642 100644
--- a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
@@ -120,7 +120,7 @@ class CookieJar implements CookieJarInterface
         } elseif (!$path) {
             $this->cookies = array_filter(
                 $this->cookies,
-                function (SetCookie $cookie) use ($path, $domain) {
+                function (SetCookie $cookie) use ($domain) {
                     return !$cookie->matchesDomain($domain);
                 }
             );
diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php
index 9887c1d..3fb8600 100644
--- a/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php
@@ -23,6 +23,7 @@ class FileCookieJar extends CookieJar
      */
     public function __construct($cookieFile, $storeSessionCookies = false)
     {
+        parent::__construct();
         $this->filename = $cookieFile;
         $this->storeSessionCookies = $storeSessionCookies;
 
@@ -56,7 +57,7 @@ class FileCookieJar extends CookieJar
         }
 
         $jsonStr = \GuzzleHttp\json_encode($json);
-        if (false === file_put_contents($filename, $jsonStr)) {
+        if (false === file_put_contents($filename, $jsonStr, LOCK_EX)) {
             throw new \RuntimeException("Unable to save file {$filename}");
         }
     }
diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
index 4497bcf..0224a24 100644
--- a/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
@@ -22,6 +22,7 @@ class SessionCookieJar extends CookieJar
      */
     public function __construct($sessionKey, $storeSessionCookies = false)
     {
+        parent::__construct();
         $this->sessionKey = $sessionKey;
         $this->storeSessionCookies = $storeSessionCookies;
         $this->load();
diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
index f699394..3d776a7 100644
--- a/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
@@ -227,7 +227,7 @@ class SetCookie
     /**
      * Get whether or not this is a secure cookie
      *
-     * @return null|bool
+     * @return bool|null
      */
     public function getSecure()
     {
@@ -247,7 +247,7 @@ class SetCookie
     /**
      * Get whether or not this is a session cookie
      *
-     * @return null|bool
+     * @return bool|null
      */
     public function getDiscard()
     {
diff --git a/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php b/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php
index f95c09f..4cfd393 100644
--- a/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php
+++ b/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php
@@ -4,4 +4,6 @@ namespace GuzzleHttp\Exception;
 /**
  * Exception when a client error is encountered (4xx codes)
  */
-class ClientException extends BadResponseException {}
+class ClientException extends BadResponseException
+{
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php b/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php
index 510778f..27b2722 100644
--- a/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php
+++ b/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php
@@ -1,13 +1,23 @@
 <?php
 namespace GuzzleHttp\Exception;
 
-/**
- * @method string getMessage()
- * @method \Throwable|null getPrevious()
- * @method mixed getCode()
- * @method string getFile()
- * @method int getLine()
- * @method array getTrace()
- * @method string getTraceAsString()
- */
-interface GuzzleException {}
+use Throwable;
+
+if (interface_exists(Throwable::class)) {
+    interface GuzzleException extends Throwable
+    {
+    }
+} else {
+    /**
+     * @method string getMessage()
+     * @method \Throwable|null getPrevious()
+     * @method mixed getCode()
+     * @method string getFile()
+     * @method int getLine()
+     * @method array getTrace()
+     * @method string getTraceAsString()
+     */
+    interface GuzzleException
+    {
+    }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php b/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
index 39de327..f38ca86 100644
--- a/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
+++ b/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
@@ -126,7 +126,7 @@ class RequestException extends TransferException
     {
         $body = $response->getBody();
 
-        if (!$body->isSeekable()) {
+        if (!$body->isSeekable() || !$body->isReadable()) {
             return null;
         }
 
diff --git a/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php b/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php
index 7cdd340..127094c 100644
--- a/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php
+++ b/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php
@@ -4,4 +4,6 @@ namespace GuzzleHttp\Exception;
 /**
  * Exception when a server error is encountered (5xx codes)
  */
-class ServerException extends BadResponseException {}
+class ServerException extends BadResponseException
+{
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php b/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php
index b60a967..fff0525 100644
--- a/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php
+++ b/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php
@@ -1,4 +1,6 @@
 <?php
 namespace GuzzleHttp\Exception;
 
-class TooManyRedirectsException extends RequestException {}
+class TooManyRedirectsException extends RequestException
+{
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php b/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php
index b92071c..7c11db3 100644
--- a/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php
+++ b/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php
@@ -1,4 +1,6 @@
 <?php
 namespace GuzzleHttp\Exception;
 
-class TransferException extends \RuntimeException implements GuzzleException {}
+class TransferException extends \RuntimeException implements GuzzleException
+{
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
index e092371..e349bb4 100644
--- a/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
+++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
@@ -14,6 +14,9 @@ use Psr\Http\Message\RequestInterface;
  */
 class CurlFactory implements CurlFactoryInterface
 {
+    const CURL_VERSION_STR = 'curl_version';
+    const LOW_CURL_VERSION_NUMBER = '7.21.2';
+
     /** @var array */
     private $handles = [];
 
@@ -117,6 +120,7 @@ class CurlFactory implements CurlFactoryInterface
     private static function invokeStats(EasyHandle $easy)
     {
         $curlStats = curl_getinfo($easy->handle);
+        $curlStats['appconnect_time'] = curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME);
         $stats = new TransferStats(
             $easy->request,
             $easy->response,
@@ -136,7 +140,9 @@ class CurlFactory implements CurlFactoryInterface
         $ctx = [
             'errno' => $easy->errno,
             'error' => curl_error($easy->handle),
+            'appconnect_time' => curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME),
         ] + curl_getinfo($easy->handle);
+        $ctx[self::CURL_VERSION_STR] = curl_version()['version'];
         $factory->release($easy);
 
         // Retry when nothing is present or when curl failed to rewind.
@@ -172,13 +178,22 @@ class CurlFactory implements CurlFactoryInterface
                 )
             );
         }
-
-        $message = sprintf(
-            'cURL error %s: %s (%s)',
-            $ctx['errno'],
-            $ctx['error'],
-            'see http://curl.haxx.se/libcurl/c/libcurl-errors.html'
-        );
+        if (version_compare($ctx[self::CURL_VERSION_STR], self::LOW_CURL_VERSION_NUMBER)) {
+            $message = sprintf(
+                'cURL error %s: %s (%s)',
+                $ctx['errno'],
+                $ctx['error'],
+                'see https://curl.haxx.se/libcurl/c/libcurl-errors.html'
+            );
+        } else {
+            $message = sprintf(
+                'cURL error %s: %s (%s) for %s',
+                $ctx['errno'],
+                $ctx['error'],
+                'see https://curl.haxx.se/libcurl/c/libcurl-errors.html',
+                $easy->request->getUri()
+            );
+        }
 
         // Create a connection exception if it was a specific error code.
         $error = isset($connectionErrors[$easy->errno])
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
index 2754d8e..d829762 100644
--- a/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
+++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
@@ -37,8 +37,14 @@ class CurlMultiHandler
     {
         $this->factory = isset($options['handle_factory'])
             ? $options['handle_factory'] : new CurlFactory(50);
-        $this->selectTimeout = isset($options['select_timeout'])
-            ? $options['select_timeout'] : 1;
+
+        if (isset($options['select_timeout'])) {
+            $this->selectTimeout = $options['select_timeout'];
+        } elseif ($selectTimeout = getenv('GUZZLE_CURL_SELECT_TIMEOUT')) {
+            $this->selectTimeout = $selectTimeout;
+        } else {
+            $this->selectTimeout = 1;
+        }
     }
 
     public function __get($name)
@@ -82,7 +88,7 @@ class CurlMultiHandler
     {
         // Add any delayed handles if needed.
         if ($this->delays) {
-            $currentTime = microtime(true);
+            $currentTime = \GuzzleHttp\_current_time();
             foreach ($this->delays as $id => $delay) {
                 if ($currentTime >= $delay) {
                     unset($this->delays[$id]);
@@ -134,7 +140,7 @@ class CurlMultiHandler
         if (empty($easy->options['delay'])) {
             curl_multi_add_handle($this->_mh, $easy->handle);
         } else {
-            $this->delays[$id] = microtime(true) + ($easy->options['delay'] / 1000);
+            $this->delays[$id] = \GuzzleHttp\_current_time() + ($easy->options['delay'] / 1000);
         }
     }
 
@@ -186,7 +192,7 @@ class CurlMultiHandler
 
     private function timeToNext()
     {
-        $currentTime = microtime(true);
+        $currentTime = \GuzzleHttp\_current_time();
         $nextTime = PHP_INT_MAX;
         foreach ($this->delays as $time) {
             if ($time < $nextTime) {
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php
index d892061..d5c449c 100644
--- a/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php
+++ b/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php
@@ -182,7 +182,8 @@ class MockHandler implements \Countable
         $reason = null
     ) {
         if (isset($options['on_stats'])) {
-            $stats = new TransferStats($request, $response, 0, $reason);
+            $transferTime = isset($options['transfer_time']) ? $options['transfer_time'] : 0;
+            $stats = new TransferStats($request, $response, $transferTime, $reason);
             call_user_func($options['on_stats'], $stats);
         }
     }
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
index b686545..0dedd7d 100644
--- a/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
+++ b/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
@@ -33,7 +33,7 @@ class StreamHandler
             usleep($options['delay'] * 1000);
         }
 
-        $startTime = isset($options['on_stats']) ? microtime(true) : null;
+        $startTime = isset($options['on_stats']) ? \GuzzleHttp\_current_time() : null;
 
         try {
             // Does not support the expect header.
@@ -42,7 +42,7 @@ class StreamHandler
             // Append a content-length header if body size is zero to match
             // cURL's behavior.
             if (0 === $request->getBody()->getSize()) {
-                $request = $request->withHeader('Content-Length', 0);
+                $request = $request->withHeader('Content-Length', '0');
             }
 
             return $this->createResponse(
@@ -82,7 +82,7 @@ class StreamHandler
             $stats = new TransferStats(
                 $request,
                 $response,
-                microtime(true) - $startTime,
+                \GuzzleHttp\_current_time() - $startTime,
                 $error,
                 []
             );
@@ -343,13 +343,25 @@ class StreamHandler
             if ('v4' === $options['force_ip_resolve']) {
                 $records = dns_get_record($uri->getHost(), DNS_A);
                 if (!isset($records[0]['ip'])) {
-                    throw new ConnectException(sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request);
+                    throw new ConnectException(
+                        sprintf(
+                            "Could not resolve IPv4 address for host '%s'",
+                            $uri->getHost()
+                        ),
+                        $request
+                    );
                 }
                 $uri = $uri->withHost($records[0]['ip']);
             } elseif ('v6' === $options['force_ip_resolve']) {
                 $records = dns_get_record($uri->getHost(), DNS_AAAA);
                 if (!isset($records[0]['ipv6'])) {
-                    throw new ConnectException(sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request);
+                    throw new ConnectException(
+                        sprintf(
+                            "Could not resolve IPv6 address for host '%s'",
+                            $uri->getHost()
+                        ),
+                        $request
+                    );
                 }
                 $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']');
             }
diff --git a/vendor/guzzlehttp/guzzle/src/HandlerStack.php b/vendor/guzzlehttp/guzzle/src/HandlerStack.php
index 24c46fd..f001686 100644
--- a/vendor/guzzlehttp/guzzle/src/HandlerStack.php
+++ b/vendor/guzzlehttp/guzzle/src/HandlerStack.php
@@ -206,7 +206,7 @@ class HandlerStack
     }
 
     /**
-     * @param $name
+     * @param string $name
      * @return int
      */
     private function findByName($name)
@@ -223,10 +223,10 @@ class HandlerStack
     /**
      * Splices a function into the middleware list at a specific position.
      *
-     * @param          $findName
-     * @param          $withName
+     * @param string   $findName
+     * @param string   $withName
      * @param callable $middleware
-     * @param          $before
+     * @param bool     $before
      */
     private function splice($findName, $withName, callable $middleware, $before)
     {
diff --git a/vendor/guzzlehttp/guzzle/src/Middleware.php b/vendor/guzzlehttp/guzzle/src/Middleware.php
index d4ad75c..bffc197 100644
--- a/vendor/guzzlehttp/guzzle/src/Middleware.php
+++ b/vendor/guzzlehttp/guzzle/src/Middleware.php
@@ -7,7 +7,6 @@ use GuzzleHttp\Promise\RejectedPromise;
 use GuzzleHttp\Psr7;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Log\LoggerInterface;
-use Psr\Log\LogLevel;
 
 /**
  * Functions used to create and wrap handlers with handler middleware.
@@ -39,7 +38,7 @@ final class Middleware
                             $cookieJar->extractCookies($request, $response);
                             return $response;
                         }
-                );
+                    );
             };
         };
     }
@@ -58,7 +57,7 @@ final class Middleware
                     return $handler($request, $options);
                 }
                 return $handler($request, $options)->then(
-                    function (ResponseInterface $response) use ($request, $handler) {
+                    function (ResponseInterface $response) use ($request) {
                         $code = $response->getStatusCode();
                         if ($code < 400) {
                             return $response;
@@ -183,7 +182,7 @@ final class Middleware
      *
      * @return callable Returns a function that accepts the next handler.
      */
-    public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = LogLevel::INFO)
+    public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = 'info' /* \Psr\Log\LogLevel::INFO */)
     {
         return function (callable $handler) use ($logger, $formatter, $logLevel) {
             return function ($request, array $options) use ($handler, $logger, $formatter, $logLevel) {
diff --git a/vendor/guzzlehttp/guzzle/src/Pool.php b/vendor/guzzlehttp/guzzle/src/Pool.php
index 8f1be33..05c854a 100644
--- a/vendor/guzzlehttp/guzzle/src/Pool.php
+++ b/vendor/guzzlehttp/guzzle/src/Pool.php
@@ -6,7 +6,7 @@ use Psr\Http\Message\RequestInterface;
 use GuzzleHttp\Promise\EachPromise;
 
 /**
- * Sends and iterator of requests concurrently using a capped pool size.
+ * Sends an iterator of requests concurrently using a capped pool size.
  *
  * The pool will read from an iterator until it is cancelled or until the
  * iterator is consumed. When a request is yielded, the request is sent after
diff --git a/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
index 131b771..bff4e4e 100644
--- a/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
+++ b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
@@ -186,7 +186,7 @@ class RedirectMiddleware
         if ($options['allow_redirects']['referer']
             && $modify['uri']->getScheme() === $request->getUri()->getScheme()
         ) {
-            $uri = $request->getUri()->withUserInfo('', '');
+            $uri = $request->getUri()->withUserInfo('');
             $modify['set_headers']['Referer'] = (string) $uri;
         } else {
             $modify['remove_headers'][] = 'Referer';
diff --git a/vendor/guzzlehttp/guzzle/src/RequestOptions.php b/vendor/guzzlehttp/guzzle/src/RequestOptions.php
index c6aacfb..5c0fd19 100644
--- a/vendor/guzzlehttp/guzzle/src/RequestOptions.php
+++ b/vendor/guzzlehttp/guzzle/src/RequestOptions.php
@@ -22,7 +22,7 @@ final class RequestOptions
      * - strict: (bool, default=false) Set to true to use strict redirects
      *   meaning redirect POST requests with POST requests vs. doing what most
      *   browsers do which is redirect POST requests with GET requests
-     * - referer: (bool, default=true) Set to false to disable the Referer
+     * - referer: (bool, default=false) Set to true to enable the Referer
      *   header.
      * - protocols: (array, default=['http', 'https']) Allowed redirect
      *   protocols.
diff --git a/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php b/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php
index f27090f..7d40eca 100644
--- a/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php
+++ b/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php
@@ -19,6 +19,9 @@ class RetryMiddleware
     /** @var callable */
     private $decider;
 
+    /** @var callable */
+    private $delay;
+
     /**
      * @param callable $decider     Function that accepts the number of retries,
      *                              a request, [response], and [exception] and
@@ -42,7 +45,7 @@ class RetryMiddleware
     /**
      * Default exponential backoff delay function.
      *
-     * @param $retries
+     * @param int $retries
      *
      * @return int
      */
diff --git a/vendor/guzzlehttp/guzzle/src/TransferStats.php b/vendor/guzzlehttp/guzzle/src/TransferStats.php
index 15f717e..23a22a3 100644
--- a/vendor/guzzlehttp/guzzle/src/TransferStats.php
+++ b/vendor/guzzlehttp/guzzle/src/TransferStats.php
@@ -20,7 +20,7 @@ final class TransferStats
     /**
      * @param RequestInterface  $request          Request that was sent.
      * @param ResponseInterface $response         Response received (if any)
-     * @param null              $transferTime     Total handler transfer time.
+     * @param float|null        $transferTime     Total handler transfer time.
      * @param mixed             $handlerErrorData Handler error data.
      * @param array             $handlerStats     Handler specific stats.
      */
diff --git a/vendor/guzzlehttp/guzzle/src/functions.php b/vendor/guzzlehttp/guzzle/src/functions.php
index a3ac450..51d736d 100644
--- a/vendor/guzzlehttp/guzzle/src/functions.php
+++ b/vendor/guzzlehttp/guzzle/src/functions.php
@@ -196,7 +196,8 @@ function default_ca_bundle()
         }
     }
 
-    throw new \RuntimeException(<<< EOT
+    throw new \RuntimeException(
+        <<< EOT
 No system CA bundle could be found in any of the the common system locations.
 PHP versions earlier than 5.6 are not properly configured to use the system's
 CA bundle by default. In order to verify peer certificates, you will need to
@@ -294,14 +295,14 @@ function is_host_in_noproxy($host, array $noProxyArray)
  * @param int    $options Bitmask of JSON decode options.
  *
  * @return mixed
- * @throws \InvalidArgumentException if the JSON cannot be decoded.
+ * @throws Exception\InvalidArgumentException if the JSON cannot be decoded.
  * @link http://www.php.net/manual/en/function.json-decode.php
  */
 function json_decode($json, $assoc = false, $depth = 512, $options = 0)
 {
     $data = \json_decode($json, $assoc, $depth, $options);
     if (JSON_ERROR_NONE !== json_last_error()) {
-        throw new \InvalidArgumentException(
+        throw new Exception\InvalidArgumentException(
             'json_decode error: ' . json_last_error_msg()
         );
     }
@@ -317,17 +318,29 @@ function json_decode($json, $assoc = false, $depth = 512, $options = 0)
  * @param int    $depth   Set the maximum depth. Must be greater than zero.
  *
  * @return string
- * @throws \InvalidArgumentException if the JSON cannot be encoded.
+ * @throws Exception\InvalidArgumentException if the JSON cannot be encoded.
  * @link http://www.php.net/manual/en/function.json-encode.php
  */
 function json_encode($value, $options = 0, $depth = 512)
 {
     $json = \json_encode($value, $options, $depth);
     if (JSON_ERROR_NONE !== json_last_error()) {
-        throw new \InvalidArgumentException(
+        throw new Exception\InvalidArgumentException(
             'json_encode error: ' . json_last_error_msg()
         );
     }
 
     return $json;
 }
+
+/**
+ * Wrapper for the hrtime() or microtime() functions
+ * (depending on the PHP version, one of the two is used)
+ *
+ * @return float|mixed UNIX timestamp
+ * @internal
+ */
+function _current_time()
+{
+    return function_exists('hrtime') ? hrtime(true) / 1e9 : microtime(true);
+}
diff --git a/vendor/monolog/monolog/.php_cs b/vendor/monolog/monolog/.php_cs
deleted file mode 100644
index 366ccd0..0000000
--- a/vendor/monolog/monolog/.php_cs
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-$header = <<<EOF
-This file is part of the Monolog package.
-
-(c) Jordi Boggiano <j.boggiano@seld.be>
-
-For the full copyright and license information, please view the LICENSE
-file that was distributed with this source code.
-EOF;
-
-$finder = Symfony\CS\Finder::create()
-    ->files()
-    ->name('*.php')
-    ->exclude('Fixtures')
-    ->in(__DIR__.'/src')
-    ->in(__DIR__.'/tests')
-;
-
-return Symfony\CS\Config::create()
-    ->setUsingCache(true)
-    //->setUsingLinter(false)
-    ->setRiskyAllowed(true)
-    ->setRules(array(
-        '@PSR2' => true,
-        'binary_operator_spaces' => true,
-        'blank_line_before_return' => true,
-        'header_comment' => array('header' => $header),
-        'include' => true,
-        'long_array_syntax' => true,
-        'method_separation' => true,
-        'no_blank_lines_after_class_opening' => true,
-        'no_blank_lines_after_phpdoc' => true,
-        'no_blank_lines_between_uses' => true,
-        'no_duplicate_semicolons' => true,
-        'no_extra_consecutive_blank_lines' => true,
-        'no_leading_import_slash' => true,
-        'no_leading_namespace_whitespace' => true,
-        'no_trailing_comma_in_singleline_array' => true,
-        'no_unused_imports' => true,
-        'object_operator_without_whitespace' => true,
-        'phpdoc_align' => true,
-        'phpdoc_indent' => true,
-        'phpdoc_no_access' => true,
-        'phpdoc_no_package' => true,
-        'phpdoc_order' => true,
-        'phpdoc_scalar' => true,
-        'phpdoc_trim' => true,
-        'phpdoc_type_to_var' => true,
-        'psr0' => true,
-        'single_blank_line_before_namespace' => true,
-        'spaces_cast' => true,
-        'standardize_not_equals' => true,
-        'ternary_operator_spaces' => true,
-        'trailing_comma_in_multiline_array' => true,
-        'whitespacy_lines' => true,
-    ))
-    ->finder($finder)
-;
diff --git a/vendor/monolog/monolog/CHANGELOG.md b/vendor/monolog/monolog/CHANGELOG.md
index bcf679c..39444c9 100644
--- a/vendor/monolog/monolog/CHANGELOG.md
+++ b/vendor/monolog/monolog/CHANGELOG.md
@@ -1,11 +1,98 @@
+### 2.0.1 (2019-11-13)
+
+  * Fixed normalization of Traversables to avoid traversing them as not all of them are rewindable
+  * Fixed setFormatter/getFormatter to forward to the nested handler in FilterHandler, FingersCrossedHandler, BufferHandler, OverflowHandler and SamplingHandler
+  * Fixed BrowserConsoleHandler formatting when using multiple styles
+  * Fixed normalization of exception codes to be always integers even for PDOException which have them as numeric strings
+  * Fixed normalization of SoapFault objects containing non-strings as "detail"
+  * Fixed json encoding across all handlers to always attempt recovery of non-UTF-8 strings instead of failing the whole encoding
+  * Fixed ChromePHPHandler to avoid sending more data than latest Chrome versions allow in headers (4KB down from 256KB).
+  * Fixed type error in BrowserConsoleHandler when the context array of log records was not associative.
+
+### 2.0.0 (2019-08-30)
+
+  * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release
+  * BC Break: Logger methods log/debug/info/notice/warning/error/critical/alert/emergency now have explicit void return types
+  * Added FallbackGroupHandler which works like the WhatFailureGroupHandler but stops dispatching log records as soon as one handler accepted it
+  * Fixed support for UTF-8 when cutting strings to avoid cutting a multibyte-character in half
+  * Fixed normalizers handling of exception backtraces to avoid serializing arguments in some cases
+  * Fixed date timezone handling in SyslogUdpHandler
+
+### 2.0.0-beta2 (2019-07-06)
+
+  * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release
+  * BC Break: PHP 7.2 is now the minimum required PHP version.
+  * BC Break: Removed SlackbotHandler, RavenHandler and HipChatHandler, see [UPGRADE.md](UPGRADE.md) for details
+  * Added OverflowHandler which will only flush log records to its nested handler when reaching a certain amount of logs (i.e. only pass through when things go really bad)
+  * Added TelegramBotHandler to log records to a [Telegram](https://core.telegram.org/bots/api) bot account
+  * Added support for JsonSerializable when normalizing exceptions
+  * Added support for RFC3164 (outdated BSD syslog protocol) to SyslogUdpHandler
+  * Added SoapFault details to formatted exceptions
+  * Fixed DeduplicationHandler silently failing to start when file could not be opened
+  * Fixed issue in GroupHandler and WhatFailureGroupHandler where setting multiple processors would duplicate records
+  * Fixed GelfFormatter losing some data when one attachment was too long
+  * Fixed issue in SignalHandler restarting syscalls functionality
+  * Improved performance of LogglyHandler when sending multiple logs in a single request
+
+### 2.0.0-beta1 (2018-12-08)
+
+  * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release
+  * BC Break: PHP 7.1 is now the minimum required PHP version.
+  * BC Break: Quite a few interface changes, only relevant if you implemented your own handlers/processors/formatters
+  * BC Break: Removed non-PSR-3 methods to add records, all the `add*` (e.g. `addWarning`) methods as well as `emerg`, `crit`, `err` and `warn`
+  * BC Break: The record timezone is now set per Logger instance and not statically anymore
+  * BC Break: There is no more default handler configured on empty Logger instances
+  * BC Break: ElasticSearchHandler renamed to ElasticaHandler
+  * BC Break: Various handler-specific breaks, see [UPGRADE.md](UPGRADE.md) for details
+  * Added scalar type hints and return hints in all the places it was possible. Switched strict_types on for more reliability.
+  * Added DateTimeImmutable support, all record datetime are now immutable, and will toString/json serialize with the correct date format, including microseconds (unless disabled)
+  * Added timezone and microseconds to the default date format
+  * Added SendGridHandler to use the SendGrid API to send emails
+  * Added LogmaticHandler to use the Logmatic.io API to store log records
+  * Added SqsHandler to send log records to an AWS SQS queue
+  * Added ElasticsearchHandler to send records via the official ES library. Elastica users should now use ElasticaHandler instead of ElasticSearchHandler
+  * Added NoopHandler which is similar to the NullHandle but does not prevent the bubbling of log records to handlers further down the configuration, useful for temporarily disabling a handler in configuration files
+  * Added ProcessHandler to write log output to the STDIN of a given process
+  * Added HostnameProcessor that adds the machine's hostname to log records
+  * Added a `$dateFormat` option to the PsrLogMessageProcessor which lets you format DateTime instances nicely
+  * Added support for the PHP 7.x `mongodb` extension in the MongoDBHandler
+  * Fixed many minor issues in various handlers, and probably added a few regressions too
+
+### 1.25.2 (2019-11-13)
+
+  * Fixed normalization of Traversables to avoid traversing them as not all of them are rewindable
+  * Fixed setFormatter/getFormatter to forward to the nested handler in FilterHandler, FingersCrossedHandler, BufferHandler and SamplingHandler
+  * Fixed BrowserConsoleHandler formatting when using multiple styles
+  * Fixed normalization of exception codes to be always integers even for PDOException which have them as numeric strings
+  * Fixed normalization of SoapFault objects containing non-strings as "detail"
+  * Fixed json encoding across all handlers to always attempt recovery of non-UTF-8 strings instead of failing the whole encoding
+
+### 1.25.1 (2019-09-06)
+
+  * Fixed forward-compatible interfaces to be compatible with Monolog 1.x too.
+
+### 1.25.0 (2019-09-06)
+
+  * Deprecated SlackbotHandler, use SlackWebhookHandler or SlackHandler instead
+  * Deprecated RavenHandler, use sentry/sentry 2.x and their Sentry\Monolog\Handler instead
+  * Deprecated HipChatHandler, migrate to Slack and use SlackWebhookHandler or SlackHandler instead
+  * Added forward-compatible interfaces and traits FormattableHandlerInterface, FormattableHandlerTrait, ProcessableHandlerInterface, ProcessableHandlerTrait. If you use modern PHP and want to make code compatible with Monolog 1 and 2 this can help. You will have to require at least Monolog 1.25 though.
+  * Added support for RFC3164 (outdated BSD syslog protocol) to SyslogUdpHandler
+  * Fixed issue in GroupHandler and WhatFailureGroupHandler where setting multiple processors would duplicate records
+  * Fixed issue in SignalHandler restarting syscalls functionality
+  * Fixed normalizers handling of exception backtraces to avoid serializing arguments in some cases
+  * Fixed ZendMonitorHandler to work with the latest Zend Server versions
+  * Fixed ChromePHPHandler to avoid sending more data than latest Chrome versions allow in headers (4KB down from 256KB).
+
 ### 1.24.0 (2018-11-05)
 
+  * BC Notice: If you are extending any of the Monolog's Formatters' `normalize` method, make sure you add the new `$depth = 0` argument to your function signature to avoid strict PHP warnings.
   * Added a `ResettableInterface` in order to reset/reset/clear/flush handlers and processors
   * Added a `ProcessorInterface` as an optional way to label a class as being a processor (mostly useful for autowiring dependency containers)
   * Added a way to log signals being received using Monolog\SignalHandler
   * Added ability to customize error handling at the Logger level using Logger::setExceptionHandler
   * Added InsightOpsHandler to migrate users of the LogEntriesHandler
-  * Added protection to NormalizerHandler against circular and very deep structures, it now stops normalizing at a depth of 9
+  * Added protection to NormalizerFormatter against circular and very deep structures, it now stops normalizing at a depth of 9
   * Added capture of stack traces to ErrorHandler when logging PHP errors
   * Added RavenHandler support for a `contexts` context or extra key to forward that to Sentry's contexts
   * Added forwarding of context info to FluentdFormatter
@@ -45,7 +132,7 @@
   * Added SlackbotHandler and SlackWebhookHandler to set up Slack integration more easily
   * Added MercurialProcessor to add mercurial revision and branch names to log records
   * Added support for AWS SDK v3 in DynamoDbHandler
-  * Fixed fatal errors occuring when normalizing generators that have been fully consumed
+  * Fixed fatal errors occurring when normalizing generators that have been fully consumed
   * Fixed RollbarHandler to include a level (rollbar level), monolog_level (original name), channel and datetime (unix)
   * Fixed RollbarHandler not flushing records automatically, calling close() explicitly is not necessary anymore
   * Fixed SyslogUdpHandler to avoid sending empty frames
@@ -55,7 +142,7 @@
 
   * Break: Reverted the addition of $context when the ErrorHandler handles regular php errors from 1.20.0 as it was causing issues
   * Added support for more formats in RotatingFileHandler::setFilenameFormat as long as they have Y, m and d in order
-  * Added ability to format the main line of text the SlackHandler sends by explictly setting a formatter on the handler
+  * Added ability to format the main line of text the SlackHandler sends by explicitly setting a formatter on the handler
   * Added information about SoapFault instances in NormalizerFormatter
   * Added $handleOnlyReportedErrors option on ErrorHandler::registerErrorHandler (default true) to allow logging of all errors no matter the error_reporting level
 
@@ -177,7 +264,7 @@
   * Added $useShortAttachment to SlackHandler to minify attachment size and $includeExtra to append extra data
   * Added $host to HipChatHandler for users of private instances
   * Added $transactionName to NewRelicHandler and support for a transaction_name context value
-  * Fixed MandrillHandler to avoid outputing API call responses
+  * Fixed MandrillHandler to avoid outputting API call responses
   * Fixed some non-standard behaviors in SyslogUdpHandler
 
 ### 1.11.0 (2014-09-30)
diff --git a/vendor/monolog/monolog/LICENSE b/vendor/monolog/monolog/LICENSE
index 1647321..5170c6d 100644
--- a/vendor/monolog/monolog/LICENSE
+++ b/vendor/monolog/monolog/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2011-2016 Jordi Boggiano
+Copyright (c) 2011-2019 Jordi Boggiano
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/monolog/monolog/README.md b/vendor/monolog/monolog/README.md
index d756944..2709be3 100644
--- a/vendor/monolog/monolog/README.md
+++ b/vendor/monolog/monolog/README.md
@@ -1,4 +1,4 @@
-# Monolog - Logging for PHP [![Build Status](https://img.shields.io/travis/Seldaek/monolog.svg)](https://travis-ci.org/Seldaek/monolog)
+# Monolog - Logging for PHP [![Build Status](https://travis-ci.org/Seldaek/monolog.svg?branch=master)](https://travis-ci.org/Seldaek/monolog)
 
 [![Total Downloads](https://img.shields.io/packagist/dt/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)
 [![Latest Stable Version](https://img.shields.io/packagist/v/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)
@@ -36,16 +36,23 @@ $log = new Logger('name');
 $log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
 
 // add records to the log
-$log->addWarning('Foo');
-$log->addError('Bar');
+$log->warning('Foo');
+$log->error('Bar');
 ```
 
 ## Documentation
 
 - [Usage Instructions](doc/01-usage.md)
 - [Handlers, Formatters and Processors](doc/02-handlers-formatters-processors.md)
-- [Utility classes](doc/03-utilities.md)
+- [Utility Classes](doc/03-utilities.md)
 - [Extending Monolog](doc/04-extending.md)
+- [Log Record Structure](doc/message-structure.md)
+
+## Support Monolog Financially
+
+Get supported Monolog and help fund the project with the [Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-monolog-monolog?utm_source=packagist-monolog-monolog&utm_medium=referral&utm_campaign=enterprise) or via [GitHub sponsorship](https://github.com/sponsors/Seldaek). 
+
+Tidelift delivers commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use.
 
 ## Third Party Packages
 
@@ -57,7 +64,7 @@ can also add your own there if you publish one.
 
 ### Requirements
 
-- Monolog works with PHP 5.3 or above, and is also tested to work with HHVM.
+- Monolog 2.x works with PHP 7.2 or above, use Monolog `^1.0` for PHP 5.3+ support.
 
 ### Submitting bugs and feature requests
 
@@ -67,17 +74,21 @@ Bugs and feature request are tracked on [GitHub](https://github.com/Seldaek/mono
 
 - Frameworks and libraries using [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)
   can be used very easily with Monolog since it implements the interface.
-- [Symfony2](http://symfony.com) comes out of the box with Monolog.
-- [Silex](http://silex.sensiolabs.org/) comes out of the box with Monolog.
-- [Laravel 4 & 5](http://laravel.com/) come out of the box with Monolog.
+- [Symfony](http://symfony.com) comes out of the box with Monolog.
+- [Laravel](http://laravel.com/) comes out of the box with Monolog.
 - [Lumen](http://lumen.laravel.com/) comes out of the box with Monolog.
-- [PPI](http://www.ppi.io/) comes out of the box with Monolog.
+- [PPI](https://github.com/ppi/framework) comes out of the box with Monolog.
 - [CakePHP](http://cakephp.org/) is usable with Monolog via the [cakephp-monolog](https://github.com/jadb/cakephp-monolog) plugin.
 - [Slim](http://www.slimframework.com/) is usable with Monolog via the [Slim-Monolog](https://github.com/Flynsarmy/Slim-Monolog) log writer.
 - [XOOPS 2.6](http://xoops.org/) comes out of the box with Monolog.
 - [Aura.Web_Project](https://github.com/auraphp/Aura.Web_Project) comes out of the box with Monolog.
 - [Nette Framework](http://nette.org/en/) can be used with Monolog via [Kdyby/Monolog](https://github.com/Kdyby/Monolog) extension.
 - [Proton Micro Framework](https://github.com/alexbilbie/Proton) comes out of the box with Monolog.
+- [FuelPHP](http://fuelphp.com/) comes out of the box with Monolog.
+- [Equip Framework](https://github.com/equip/framework) comes out of the box with Monolog.
+- [Yii 2](http://www.yiiframework.com/) is usable with Monolog via the [yii2-monolog](https://github.com/merorafael/yii2-monolog) or [yii2-psr-log-target](https://github.com/samdark/yii2-psr-log-target) plugins.
+- [Hawkbit Micro Framework](https://github.com/HawkBitPhp/hawkbit) comes out of the box with Monolog.
+- [SilverStripe 4](https://www.silverstripe.org/) comes out of the box with Monolog.
 
 ### Author
 
@@ -90,5 +101,5 @@ Monolog is licensed under the MIT License - see the `LICENSE` file for details
 
 ### Acknowledgements
 
-This library is heavily inspired by Python's [Logbook](http://packages.python.org/Logbook/)
+This library is heavily inspired by Python's [Logbook](https://logbook.readthedocs.io/en/stable/)
 library, although most concepts have been adjusted to fit to the PHP world.
diff --git a/vendor/monolog/monolog/composer.json b/vendor/monolog/monolog/composer.json
index 3b0c880..21d8064 100644
--- a/vendor/monolog/monolog/composer.json
+++ b/vendor/monolog/monolog/composer.json
@@ -13,35 +13,37 @@
         }
     ],
     "require": {
-        "php": ">=5.3.0",
-        "psr/log": "~1.0"
+        "php": "^7.2",
+        "psr/log": "^1.0.1"
     },
     "require-dev": {
-        "phpunit/phpunit": "~4.5",
-        "graylog2/gelf-php": "~1.0",
-        "sentry/sentry": "^0.13",
-        "ruflin/elastica": ">=0.90 <3.0",
-        "doctrine/couchdb": "~1.0@dev",
         "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+        "doctrine/couchdb": "~1.0@dev",
+        "elasticsearch/elasticsearch": "^6.0",
+        "graylog2/gelf-php": "^1.4.2",
+        "jakub-onderka/php-parallel-lint": "^0.9",
         "php-amqplib/php-amqplib": "~2.4",
-        "swiftmailer/swiftmailer": "^5.3|^6.0",
         "php-console/php-console": "^3.1.3",
-        "phpunit/phpunit-mock-objects": "2.3.0",
-        "jakub-onderka/php-parallel-lint": "0.9"
+        "phpspec/prophecy": "^1.6.1",
+        "phpunit/phpunit": "^8.3",
+        "predis/predis": "^1.1",
+        "rollbar/rollbar": "^1.3",
+        "ruflin/elastica": ">=0.90 <3.0",
+        "swiftmailer/swiftmailer": "^5.3|^6.0"
     },
-    "_": "phpunit/phpunit-mock-objects required in 2.3.0 due to https://github.com/sebastianbergmann/phpunit-mock-objects/issues/223 - needs hhvm 3.8+ on travis",
     "suggest": {
         "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
-        "sentry/sentry": "Allow sending log messages to a Sentry server",
         "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
         "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
+        "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
         "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
         "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
-        "ext-mongo": "Allow sending log messages to a MongoDB server",
-        "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
+        "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+        "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
         "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
         "rollbar/rollbar": "Allow sending log messages to Rollbar",
-        "php-console/php-console": "Allow sending log messages to Google Chrome"
+        "php-console/php-console": "Allow sending log messages to Google Chrome",
+        "ext-mbstring": "Allow to work properly with unicode symbols"
     },
     "autoload": {
         "psr-4": {"Monolog\\": "src/Monolog"}
@@ -54,7 +56,7 @@
     },
     "extra": {
         "branch-alias": {
-            "dev-master": "2.0.x-dev"
+            "dev-master": "2.x-dev"
         }
     },
     "scripts": {
@@ -62,5 +64,8 @@
             "parallel-lint . --exclude vendor",
             "phpunit"
         ]
+    },
+    "config": {
+        "sort-packages": true
     }
 }
diff --git a/vendor/monolog/monolog/doc/01-usage.md b/vendor/monolog/monolog/doc/01-usage.md
deleted file mode 100644
index 8e2551f..0000000
--- a/vendor/monolog/monolog/doc/01-usage.md
+++ /dev/null
@@ -1,231 +0,0 @@
-# Using Monolog
-
-- [Installation](#installation)
-- [Core Concepts](#core-concepts)
-- [Log Levels](#log-levels)
-- [Configuring a logger](#configuring-a-logger)
-- [Adding extra data in the records](#adding-extra-data-in-the-records)
-- [Leveraging channels](#leveraging-channels)
-- [Customizing the log format](#customizing-the-log-format)
-
-## Installation
-
-Monolog is available on Packagist ([monolog/monolog](http://packagist.org/packages/monolog/monolog))
-and as such installable via [Composer](http://getcomposer.org/).
-
-```bash
-composer require monolog/monolog
-```
-
-If you do not use Composer, you can grab the code from GitHub, and use any
-PSR-0 compatible autoloader (e.g. the [Symfony2 ClassLoader component](https://github.com/symfony/ClassLoader))
-to load Monolog classes.
-
-## Core Concepts
-
-Every `Logger` instance has a channel (name) and a stack of handlers. Whenever
-you add a record to the logger, it traverses the handler stack. Each handler
-decides whether it fully handled the record, and if so, the propagation of the
-record ends there.
-
-This allows for flexible logging setups, for example having a `StreamHandler` at
-the bottom of the stack that will log anything to disk, and on top of that add
-a `MailHandler` that will send emails only when an error message is logged.
-Handlers also have a `$bubble` property which defines whether they block the
-record or not if they handled it. In this example, setting the `MailHandler`'s
-`$bubble` argument to false means that records handled by the `MailHandler` will
-not propagate to the `StreamHandler` anymore.
-
-You can create many `Logger`s, each defining a channel (e.g.: db, request,
-router, ..) and each of them combining various handlers, which can be shared
-or not. The channel is reflected in the logs and allows you to easily see or
-filter records.
-
-Each Handler also has a Formatter, a default one with settings that make sense
-will be created if you don't set one. The formatters normalize and format
-incoming records so that they can be used by the handlers to output useful
-information.
-
-Custom severity levels are not available. Only the eight
-[RFC 5424](http://tools.ietf.org/html/rfc5424) levels (debug, info, notice,
-warning, error, critical, alert, emergency) are present for basic filtering
-purposes, but for sorting and other use cases that would require
-flexibility, you should add Processors to the Logger that can add extra
-information (tags, user ip, ..) to the records before they are handled.
-
-## Log Levels
-
-Monolog supports the logging levels described by [RFC 5424](http://tools.ietf.org/html/rfc5424).
-
-- **DEBUG** (100): Detailed debug information.
-
-- **INFO** (200): Interesting events. Examples: User logs in, SQL logs.
-
-- **NOTICE** (250): Normal but significant events.
-
-- **WARNING** (300): Exceptional occurrences that are not errors. Examples:
-  Use of deprecated APIs, poor use of an API, undesirable things that are not
-  necessarily wrong.
-
-- **ERROR** (400): Runtime errors that do not require immediate action but
-  should typically be logged and monitored.
-
-- **CRITICAL** (500): Critical conditions. Example: Application component
-  unavailable, unexpected exception.
-
-- **ALERT** (550): Action must be taken immediately. Example: Entire website
-  down, database unavailable, etc. This should trigger the SMS alerts and wake
-  you up.
-
-- **EMERGENCY** (600): Emergency: system is unusable.
-
-## Configuring a logger
-
-Here is a basic setup to log to a file and to firephp on the DEBUG level:
-
-```php
-<?php
-
-use Monolog\Logger;
-use Monolog\Handler\StreamHandler;
-use Monolog\Handler\FirePHPHandler;
-
-// Create the logger
-$logger = new Logger('my_logger');
-// Now add some handlers
-$logger->pushHandler(new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG));
-$logger->pushHandler(new FirePHPHandler());
-
-// You can now use your logger
-$logger->addInfo('My logger is now ready');
-```
-
-Let's explain it. The first step is to create the logger instance which will
-be used in your code. The argument is a channel name, which is useful when
-you use several loggers (see below for more details about it).
-
-The logger itself does not know how to handle a record. It delegates it to
-some handlers. The code above registers two handlers in the stack to allow
-handling records in two different ways.
-
-Note that the FirePHPHandler is called first as it is added on top of the
-stack. This allows you to temporarily add a logger with bubbling disabled if
-you want to override other configured loggers.
-
-> If you use Monolog standalone and are looking for an easy way to
-> configure many handlers, the [theorchard/monolog-cascade](https://github.com/theorchard/monolog-cascade)
-> can help you build complex logging configs via PHP arrays, yaml or json configs.
-
-## Adding extra data in the records
-
-Monolog provides two different ways to add extra informations along the simple
-textual message.
-
-### Using the logging context
-
-The first way is the context, allowing to pass an array of data along the
-record:
-
-```php
-<?php
-
-$logger->addInfo('Adding a new user', array('username' => 'Seldaek'));
-```
-
-Simple handlers (like the StreamHandler for instance) will simply format
-the array to a string but richer handlers can take advantage of the context
-(FirePHP is able to display arrays in pretty way for instance).
-
-### Using processors
-
-The second way is to add extra data for all records by using a processor.
-Processors can be any callable. They will get the record as parameter and
-must return it after having eventually changed the `extra` part of it. Let's
-write a processor adding some dummy data in the record:
-
-```php
-<?php
-
-$logger->pushProcessor(function ($record) {
-    $record['extra']['dummy'] = 'Hello world!';
-
-    return $record;
-});
-```
-
-Monolog provides some built-in processors that can be used in your project.
-Look at the [dedicated chapter](https://github.com/Seldaek/monolog/blob/master/doc/02-handlers-formatters-processors.md#processors) for the list.
-
-> Tip: processors can also be registered on a specific handler instead of
-  the logger to apply only for this handler.
-
-## Leveraging channels
-
-Channels are a great way to identify to which part of the application a record
-is related. This is useful in big applications (and is leveraged by
-MonologBundle in Symfony2).
-
-Picture two loggers sharing a handler that writes to a single log file.
-Channels would allow you to identify the logger that issued every record.
-You can easily grep through the log files filtering this or that channel.
-
-```php
-<?php
-
-use Monolog\Logger;
-use Monolog\Handler\StreamHandler;
-use Monolog\Handler\FirePHPHandler;
-
-// Create some handlers
-$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);
-$firephp = new FirePHPHandler();
-
-// Create the main logger of the app
-$logger = new Logger('my_logger');
-$logger->pushHandler($stream);
-$logger->pushHandler($firephp);
-
-// Create a logger for the security-related stuff with a different channel
-$securityLogger = new Logger('security');
-$securityLogger->pushHandler($stream);
-$securityLogger->pushHandler($firephp);
-
-// Or clone the first one to only change the channel
-$securityLogger = $logger->withName('security');
-```
-
-## Customizing the log format
-
-In Monolog it's easy to customize the format of the logs written into files,
-sockets, mails, databases and other handlers. Most of the handlers use the
-
-```php
-$record['formatted']
-```
-
-value to be automatically put into the log device. This value depends on the
-formatter settings. You can choose between predefined formatter classes or
-write your own (e.g. a multiline text file for human-readable output).
-
-To configure a predefined formatter class, just set it as the handler's field:
-
-```php
-// the default date format is "Y-m-d H:i:s"
-$dateFormat = "Y n j, g:i a";
-// the default output format is "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"
-$output = "%datetime% > %level_name% > %message% %context% %extra%\n";
-// finally, create a formatter
-$formatter = new LineFormatter($output, $dateFormat);
-
-// Create a handler
-$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);
-$stream->setFormatter($formatter);
-// bind it to a logger object
-$securityLogger = new Logger('security');
-$securityLogger->pushHandler($stream);
-```
-
-You may also reuse the same formatter between multiple handlers and share those
-handlers between multiple loggers.
-
-[Handlers, Formatters and Processors](02-handlers-formatters-processors.md) &rarr;
diff --git a/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md b/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md
deleted file mode 100644
index af45913..0000000
--- a/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md
+++ /dev/null
@@ -1,158 +0,0 @@
-# Handlers, Formatters and Processors
-
-- [Handlers](#handlers)
-  - [Log to files and syslog](#log-to-files-and-syslog)
-  - [Send alerts and emails](#send-alerts-and-emails)
-  - [Log specific servers and networked logging](#log-specific-servers-and-networked-logging)
-  - [Logging in development](#logging-in-development)
-  - [Log to databases](#log-to-databases)
-  - [Wrappers / Special Handlers](#wrappers--special-handlers)
-- [Formatters](#formatters)
-- [Processors](#processors)
-- [Third Party Packages](#third-party-packages)
-
-## Handlers
-
-### Log to files and syslog
-
-- _StreamHandler_: Logs records into any PHP stream, use this for log files.
-- _RotatingFileHandler_: Logs records to a file and creates one logfile per day.
-  It will also delete files older than `$maxFiles`. You should use
-  [logrotate](http://linuxcommand.org/man_pages/logrotate8.html) for high profile
-  setups though, this is just meant as a quick and dirty solution.
-- _SyslogHandler_: Logs records to the syslog.
-- _ErrorLogHandler_: Logs records to PHP's
-  [`error_log()`](http://docs.php.net/manual/en/function.error-log.php) function.
-
-### Send alerts and emails
-
-- _NativeMailerHandler_: Sends emails using PHP's
-  [`mail()`](http://php.net/manual/en/function.mail.php) function.
-- _SwiftMailerHandler_: Sends emails using a [`Swift_Mailer`](http://swiftmailer.org/) instance.
-- _PushoverHandler_: Sends mobile notifications via the [Pushover](https://www.pushover.net/) API.
-- _HipChatHandler_: Logs records to a [HipChat](http://hipchat.com) chat room using its API.
-- _FlowdockHandler_: Logs records to a [Flowdock](https://www.flowdock.com/) account.
-- _SlackHandler_: Logs records to a [Slack](https://www.slack.com/) account using the Slack API.
-- _SlackbotHandler_: Logs records to a [Slack](https://www.slack.com/) account using the Slackbot incoming hook.
-- _SlackWebhookHandler_: Logs records to a [Slack](https://www.slack.com/) account using Slack Webhooks.
-- _MandrillHandler_: Sends emails via the Mandrill API using a [`Swift_Message`](http://swiftmailer.org/) instance.
-- _FleepHookHandler_: Logs records to a [Fleep](https://fleep.io/) conversation using Webhooks.
-- _IFTTTHandler_: Notifies an [IFTTT](https://ifttt.com/maker) trigger with the log channel, level name and message.
-
-### Log specific servers and networked logging
-
-- _SocketHandler_: Logs records to [sockets](http://php.net/fsockopen), use this
-  for UNIX and TCP sockets. See an [example](sockets.md).
-- _AmqpHandler_: Logs records to an [amqp](http://www.amqp.org/) compatible
-  server. Requires the [php-amqp](http://pecl.php.net/package/amqp) extension (1.0+).
-- _GelfHandler_: Logs records to a [Graylog2](http://www.graylog2.org) server.
-- _CubeHandler_: Logs records to a [Cube](http://square.github.com/cube/) server.
-- _RavenHandler_: Logs records to a [Sentry](http://getsentry.com/) server using
-  [raven](https://packagist.org/packages/raven/raven).
-- _ZendMonitorHandler_: Logs records to the Zend Monitor present in Zend Server.
-- _NewRelicHandler_: Logs records to a [NewRelic](http://newrelic.com/) application.
-- _LogglyHandler_: Logs records to a [Loggly](http://www.loggly.com/) account.
-- _RollbarHandler_: Logs records to a [Rollbar](https://rollbar.com/) account.
-- _SyslogUdpHandler_: Logs records to a remote [Syslogd](http://www.rsyslog.com/) server.
-- _LogEntriesHandler_: Logs records to a [LogEntries](http://logentries.com/) account.
-- _InsightOpsHandler_: Logs records to a [InsightOps](https://www.rapid7.com/products/insightops/) account.
-
-### Logging in development
-
-- _FirePHPHandler_: Handler for [FirePHP](http://www.firephp.org/), providing
-  inline `console` messages within [FireBug](http://getfirebug.com/).
-- _ChromePHPHandler_: Handler for [ChromePHP](http://www.chromephp.com/), providing
-  inline `console` messages within Chrome.
-- _BrowserConsoleHandler_: Handler to send logs to browser's Javascript `console` with
-  no browser extension required. Most browsers supporting `console` API are supported.
-- _PHPConsoleHandler_: Handler for [PHP Console](https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef), providing
-  inline `console` and notification popup messages within Chrome.
-
-### Log to databases
-
-- _RedisHandler_: Logs records to a [redis](http://redis.io) server.
-- _MongoDBHandler_: Handler to write records in MongoDB via a
-  [Mongo](http://pecl.php.net/package/mongo) extension connection.
-- _CouchDBHandler_: Logs records to a CouchDB server.
-- _DoctrineCouchDBHandler_: Logs records to a CouchDB server via the Doctrine CouchDB ODM.
-- _ElasticSearchHandler_: Logs records to an Elastic Search server.
-- _DynamoDbHandler_: Logs records to a DynamoDB table with the [AWS SDK](https://github.com/aws/aws-sdk-php).
-
-### Wrappers / Special Handlers
-
-- _FingersCrossedHandler_: A very interesting wrapper. It takes a logger as
-  parameter and will accumulate log records of all levels until a record
-  exceeds the defined severity level. At which point it delivers all records,
-  including those of lower severity, to the handler it wraps. This means that
-  until an error actually happens you will not see anything in your logs, but
-  when it happens you will have the full information, including debug and info
-  records. This provides you with all the information you need, but only when
-  you need it.
-- _DeduplicationHandler_: Useful if you are sending notifications or emails
-  when critical errors occur. It takes a logger as parameter and will
-  accumulate log records of all levels until the end of the request (or
-  `flush()` is called). At that point it delivers all records to the handler
-  it wraps, but only if the records are unique over a given time period
-  (60seconds by default). If the records are duplicates they are simply
-  discarded. The main use of this is in case of critical failure like if your
-  database is unreachable for example all your requests will fail and that
-  can result in a lot of notifications being sent. Adding this handler reduces
-  the amount of notifications to a manageable level.
-- _WhatFailureGroupHandler_: This handler extends the _GroupHandler_ ignoring
-   exceptions raised by each child handler. This allows you to ignore issues
-   where a remote tcp connection may have died but you do not want your entire
-   application to crash and may wish to continue to log to other handlers.
-- _BufferHandler_: This handler will buffer all the log records it receives
-  until `close()` is called at which point it will call `handleBatch()` on the
-  handler it wraps with all the log messages at once. This is very useful to
-  send an email with all records at once for example instead of having one mail
-  for every log record.
-- _GroupHandler_: This handler groups other handlers. Every record received is
-  sent to all the handlers it is configured with.
-- _FilterHandler_: This handler only lets records of the given levels through
-   to the wrapped handler.
-- _SamplingHandler_: Wraps around another handler and lets you sample records
-   if you only want to store some of them.
-- _NullHandler_: Any record it can handle will be thrown away. This can be used
-  to put on top of an existing handler stack to disable it temporarily.
-- _PsrHandler_: Can be used to forward log records to an existing PSR-3 logger
-- _TestHandler_: Used for testing, it records everything that is sent to it and
-  has accessors to read out the information.
-- _HandlerWrapper_: A simple handler wrapper you can inherit from to create
- your own wrappers easily.
-
-## Formatters
-
-- _LineFormatter_: Formats a log record into a one-line string.
-- _HtmlFormatter_: Used to format log records into a human readable html table, mainly suitable for emails.
-- _NormalizerFormatter_: Normalizes objects/resources down to strings so a record can easily be serialized/encoded.
-- _ScalarFormatter_: Used to format log records into an associative array of scalar values.
-- _JsonFormatter_: Encodes a log record into json.
-- _WildfireFormatter_: Used to format log records into the Wildfire/FirePHP protocol, only useful for the FirePHPHandler.
-- _ChromePHPFormatter_: Used to format log records into the ChromePHP format, only useful for the ChromePHPHandler.
-- _GelfMessageFormatter_: Used to format log records into Gelf message instances, only useful for the GelfHandler.
-- _LogstashFormatter_: Used to format log records into [logstash](http://logstash.net/) event json, useful for any handler listed under inputs [here](http://logstash.net/docs/latest).
-- _ElasticaFormatter_: Used to format log records into an Elastica\Document object, only useful for the ElasticSearchHandler.
-- _LogglyFormatter_: Used to format log records into Loggly messages, only useful for the LogglyHandler.
-- _FlowdockFormatter_: Used to format log records into Flowdock messages, only useful for the FlowdockHandler.
-- _MongoDBFormatter_: Converts \DateTime instances to \MongoDate and objects recursively to arrays, only useful with the MongoDBHandler.
-
-## Processors
-
-- _PsrLogMessageProcessor_: Processes a log record's message according to PSR-3 rules, replacing `{foo}` with the value from `$context['foo']`.
-- _IntrospectionProcessor_: Adds the line/file/class/method from which the log call originated.
-- _WebProcessor_: Adds the current request URI, request method and client IP to a log record.
-- _MemoryUsageProcessor_: Adds the current memory usage to a log record.
-- _MemoryPeakUsageProcessor_: Adds the peak memory usage to a log record.
-- _ProcessIdProcessor_: Adds the process id to a log record.
-- _UidProcessor_: Adds a unique identifier to a log record.
-- _GitProcessor_: Adds the current git branch and commit to a log record.
-- _TagProcessor_: Adds an array of predefined tags to a log record.
-
-## Third Party Packages
-
-Third party handlers, formatters and processors are
-[listed in the wiki](https://github.com/Seldaek/monolog/wiki/Third-Party-Packages). You
-can also add your own there if you publish one.
-
-&larr; [Usage](01-usage.md) |  [Utility classes](03-utilities.md) &rarr;
diff --git a/vendor/monolog/monolog/doc/03-utilities.md b/vendor/monolog/monolog/doc/03-utilities.md
deleted file mode 100644
index fd3fd0e..0000000
--- a/vendor/monolog/monolog/doc/03-utilities.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Utilities
-
-- _Registry_: The `Monolog\Registry` class lets you configure global loggers that you
-  can then statically access from anywhere. It is not really a best practice but can
-  help in some older codebases or for ease of use.
-- _ErrorHandler_: The `Monolog\ErrorHandler` class allows you to easily register
-  a Logger instance as an exception handler, error handler or fatal error handler.
-- _SignalHandler_: The `Monolog\SignalHandler` class allows you to easily register
-  a Logger instance as a POSIX signal handler.
-- _ErrorLevelActivationStrategy_: Activates a FingersCrossedHandler when a certain log
-  level is reached.
-- _ChannelLevelActivationStrategy_: Activates a FingersCrossedHandler when a certain
-  log level is reached, depending on which channel received the log record.
-
-&larr; [Handlers, Formatters and Processors](02-handlers-formatters-processors.md) |  [Extending Monolog](04-extending.md) &rarr;
diff --git a/vendor/monolog/monolog/doc/04-extending.md b/vendor/monolog/monolog/doc/04-extending.md
deleted file mode 100644
index ebd9104..0000000
--- a/vendor/monolog/monolog/doc/04-extending.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# Extending Monolog
-
-Monolog is fully extensible, allowing you to adapt your logger to your needs.
-
-## Writing your own handler
-
-Monolog provides many built-in handlers. But if the one you need does not
-exist, you can write it and use it in your logger. The only requirement is
-to implement `Monolog\Handler\HandlerInterface`.
-
-Let's write a PDOHandler to log records to a database. We will extend the
-abstract class provided by Monolog to keep things DRY.
-
-```php
-<?php
-
-use Monolog\Logger;
-use Monolog\Handler\AbstractProcessingHandler;
-
-class PDOHandler extends AbstractProcessingHandler
-{
-    private $initialized = false;
-    private $pdo;
-    private $statement;
-
-    public function __construct(PDO $pdo, $level = Logger::DEBUG, $bubble = true)
-    {
-        $this->pdo = $pdo;
-        parent::__construct($level, $bubble);
-    }
-
-    protected function write(array $record)
-    {
-        if (!$this->initialized) {
-            $this->initialize();
-        }
-
-        $this->statement->execute(array(
-            'channel' => $record['channel'],
-            'level' => $record['level'],
-            'message' => $record['formatted'],
-            'time' => $record['datetime']->format('U'),
-        ));
-    }
-
-    private function initialize()
-    {
-        $this->pdo->exec(
-            'CREATE TABLE IF NOT EXISTS monolog '
-            .'(channel VARCHAR(255), level INTEGER, message LONGTEXT, time INTEGER UNSIGNED)'
-        );
-        $this->statement = $this->pdo->prepare(
-            'INSERT INTO monolog (channel, level, message, time) VALUES (:channel, :level, :message, :time)'
-        );
-
-        $this->initialized = true;
-    }
-}
-```
-
-You can now use this handler in your logger:
-
-```php
-<?php
-
-$logger->pushHandler(new PDOHandler(new PDO('sqlite:logs.sqlite')));
-
-// You can now use your logger
-$logger->addInfo('My logger is now ready');
-```
-
-The `Monolog\Handler\AbstractProcessingHandler` class provides most of the
-logic needed for the handler, including the use of processors and the formatting
-of the record (which is why we use ``$record['formatted']`` instead of ``$record['message']``).
-
-&larr; [Utility classes](03-utilities.md)
diff --git a/vendor/monolog/monolog/doc/sockets.md b/vendor/monolog/monolog/doc/sockets.md
deleted file mode 100644
index ea9cf0e..0000000
--- a/vendor/monolog/monolog/doc/sockets.md
+++ /dev/null
@@ -1,39 +0,0 @@
-Sockets Handler
-===============
-
-This handler allows you to write your logs to sockets using [fsockopen](http://php.net/fsockopen)
-or [pfsockopen](http://php.net/pfsockopen).
-
-Persistent sockets are mainly useful in web environments where you gain some performance not closing/opening
-the connections between requests.
-
-You can use a `unix://` prefix to access unix sockets and `udp://` to open UDP sockets instead of the default TCP.
-
-Basic Example
--------------
-
-```php
-<?php
-
-use Monolog\Logger;
-use Monolog\Handler\SocketHandler;
-
-// Create the logger
-$logger = new Logger('my_logger');
-
-// Create the handler
-$handler = new SocketHandler('unix:///var/log/httpd_app_log.socket');
-$handler->setPersistent(true);
-
-// Now add the handler
-$logger->pushHandler($handler, Logger::DEBUG);
-
-// You can now use your logger
-$logger->addInfo('My logger is now ready');
-
-```
-
-In this example, using syslog-ng, you should see the log on the log server:
-
-    cweb1 [2012-02-26 00:12:03] my_logger.INFO: My logger is now ready [] []
-
diff --git a/vendor/monolog/monolog/phpunit.xml.dist b/vendor/monolog/monolog/phpunit.xml.dist
deleted file mode 100644
index 20d82b6..0000000
--- a/vendor/monolog/monolog/phpunit.xml.dist
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<phpunit bootstrap="vendor/autoload.php" colors="true">
-    <testsuites>
-        <testsuite name="Monolog Test Suite">
-            <directory>tests/Monolog/</directory>
-        </testsuite>
-    </testsuites>
-
-    <filter>
-        <whitelist>
-            <directory suffix=".php">src/Monolog/</directory>
-        </whitelist>
-    </filter>
-
-    <php>
-        <ini name="date.timezone" value="UTC"/>
-    </php>
-</phpunit>
diff --git a/vendor/monolog/monolog/src/Monolog/ErrorHandler.php b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php
index adc55bd..2643fdb 100644
--- a/vendor/monolog/monolog/src/Monolog/ErrorHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -13,8 +13,6 @@ namespace Monolog;
 
 use Psr\Log\LoggerInterface;
 use Psr\Log\LogLevel;
-use Monolog\Handler\AbstractHandler;
-use Monolog\Registry;
 
 /**
  * Monolog error handler
@@ -30,7 +28,7 @@ class ErrorHandler
     private $logger;
 
     private $previousExceptionHandler;
-    private $uncaughtExceptionLevel;
+    private $uncaughtExceptionLevelMap;
 
     private $previousErrorHandler;
     private $errorLevelMap;
@@ -40,7 +38,7 @@ class ErrorHandler
     private $fatalLevel;
     private $reservedMemory;
     private $lastFatalTrace;
-    private static $fatalErrors = array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR);
+    private static $fatalErrors = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR];
 
     public function __construct(LoggerInterface $logger)
     {
@@ -52,23 +50,20 @@ class ErrorHandler
      *
      * By default it will handle errors, exceptions and fatal errors
      *
-     * @param  LoggerInterface $logger
-     * @param  array|false     $errorLevelMap  an array of E_* constant to LogLevel::* constant mapping, or false to disable error handling
-     * @param  int|false       $exceptionLevel a LogLevel::* constant, or false to disable exception handling
-     * @param  int|false       $fatalLevel     a LogLevel::* constant, or false to disable fatal error handling
+     * @param  LoggerInterface   $logger
+     * @param  array|false       $errorLevelMap     an array of E_* constant to LogLevel::* constant mapping, or false to disable error handling
+     * @param  array|false       $exceptionLevelMap an array of class name to LogLevel::* constant mapping, or false to disable exception handling
+     * @param  string|null|false $fatalLevel        a LogLevel::* constant, null to use the default LogLevel::ALERT or false to disable fatal error handling
      * @return ErrorHandler
      */
-    public static function register(LoggerInterface $logger, $errorLevelMap = array(), $exceptionLevel = null, $fatalLevel = null)
+    public static function register(LoggerInterface $logger, $errorLevelMap = [], $exceptionLevelMap = [], $fatalLevel = null): self
     {
-        //Forces the autoloader to run for LogLevel. Fixes an autoload issue at compile-time on PHP5.3. See https://github.com/Seldaek/monolog/pull/929
-        class_exists('\\Psr\\Log\\LogLevel', true);
-
         $handler = new static($logger);
         if ($errorLevelMap !== false) {
             $handler->registerErrorHandler($errorLevelMap);
         }
-        if ($exceptionLevel !== false) {
-            $handler->registerExceptionHandler($exceptionLevel);
+        if ($exceptionLevelMap !== false) {
+            $handler->registerExceptionHandler($exceptionLevelMap);
         }
         if ($fatalLevel !== false) {
             $handler->registerFatalHandler($fatalLevel);
@@ -77,38 +72,61 @@ class ErrorHandler
         return $handler;
     }
 
-    public function registerExceptionHandler($level = null, $callPrevious = true)
+    public function registerExceptionHandler($levelMap = [], $callPrevious = true): self
     {
-        $prev = set_exception_handler(array($this, 'handleException'));
-        $this->uncaughtExceptionLevel = $level;
+        $prev = set_exception_handler([$this, 'handleException']);
+        $this->uncaughtExceptionLevelMap = $levelMap;
+        foreach ($this->defaultExceptionLevelMap() as $class => $level) {
+            if (!isset($this->uncaughtExceptionLevelMap[$class])) {
+                $this->uncaughtExceptionLevelMap[$class] = $level;
+            }
+        }
         if ($callPrevious && $prev) {
             $this->previousExceptionHandler = $prev;
         }
+
+        return $this;
     }
 
-    public function registerErrorHandler(array $levelMap = array(), $callPrevious = true, $errorTypes = -1, $handleOnlyReportedErrors = true)
+    public function registerErrorHandler(array $levelMap = [], $callPrevious = true, $errorTypes = -1, $handleOnlyReportedErrors = true): self
     {
-        $prev = set_error_handler(array($this, 'handleError'), $errorTypes);
+        $prev = set_error_handler([$this, 'handleError'], $errorTypes);
         $this->errorLevelMap = array_replace($this->defaultErrorLevelMap(), $levelMap);
         if ($callPrevious) {
             $this->previousErrorHandler = $prev ?: true;
         }
 
         $this->handleOnlyReportedErrors = $handleOnlyReportedErrors;
+
+        return $this;
     }
 
-    public function registerFatalHandler($level = null, $reservedMemorySize = 20)
+    /**
+     * @param string|null $level              a LogLevel::* constant, null to use the default LogLevel::ALERT or false to disable fatal error handling
+     * @param int         $reservedMemorySize Amount of KBs to reserve in memory so that it can be freed when handling fatal errors giving Monolog some room in memory to get its job done
+     */
+    public function registerFatalHandler($level = null, int $reservedMemorySize = 20): self
     {
-        register_shutdown_function(array($this, 'handleFatalError'));
+        register_shutdown_function([$this, 'handleFatalError']);
 
         $this->reservedMemory = str_repeat(' ', 1024 * $reservedMemorySize);
         $this->fatalLevel = $level;
         $this->hasFatalErrorHandler = true;
+
+        return $this;
+    }
+
+    protected function defaultExceptionLevelMap(): array
+    {
+        return [
+            'ParseError' => LogLevel::CRITICAL,
+            'Throwable' => LogLevel::ERROR,
+        ];
     }
 
-    protected function defaultErrorLevelMap()
+    protected function defaultErrorLevelMap(): array
     {
-        return array(
+        return [
             E_ERROR             => LogLevel::CRITICAL,
             E_WARNING           => LogLevel::WARNING,
             E_PARSE             => LogLevel::ALERT,
@@ -124,31 +142,44 @@ class ErrorHandler
             E_RECOVERABLE_ERROR => LogLevel::ERROR,
             E_DEPRECATED        => LogLevel::NOTICE,
             E_USER_DEPRECATED   => LogLevel::NOTICE,
-        );
+        ];
     }
 
     /**
      * @private
+     * @param \Exception $e
      */
     public function handleException($e)
     {
+        $level = LogLevel::ERROR;
+        foreach ($this->uncaughtExceptionLevelMap as $class => $candidate) {
+            if ($e instanceof $class) {
+                $level = $candidate;
+                break;
+            }
+        }
+
         $this->logger->log(
-            $this->uncaughtExceptionLevel === null ? LogLevel::ERROR : $this->uncaughtExceptionLevel,
+            $level,
             sprintf('Uncaught Exception %s: "%s" at %s line %s', Utils::getClass($e), $e->getMessage(), $e->getFile(), $e->getLine()),
-            array('exception' => $e)
+            ['exception' => $e]
         );
 
         if ($this->previousExceptionHandler) {
             call_user_func($this->previousExceptionHandler, $e);
         }
 
+        if (!headers_sent() && !ini_get('display_errors')) {
+            http_response_code(500);
+        }
+
         exit(255);
     }
 
     /**
      * @private
      */
-    public function handleError($code, $message, $file = '', $line = 0, $context = array())
+    public function handleError($code, $message, $file = '', $line = 0, $context = [])
     {
         if ($this->handleOnlyReportedErrors && !(error_reporting() & $code)) {
             return;
@@ -156,13 +187,10 @@ class ErrorHandler
 
         // fatal error codes are ignored if a fatal error handler is present as well to avoid duplicate log entries
         if (!$this->hasFatalErrorHandler || !in_array($code, self::$fatalErrors, true)) {
-            $level = isset($this->errorLevelMap[$code]) ? $this->errorLevelMap[$code] : LogLevel::CRITICAL;
-            $this->logger->log($level, self::codeToString($code).': '.$message, array('code' => $code, 'message' => $message, 'file' => $file, 'line' => $line));
+            $level = $this->errorLevelMap[$code] ?? LogLevel::CRITICAL;
+            $this->logger->log($level, self::codeToString($code).': '.$message, ['code' => $code, 'message' => $message, 'file' => $file, 'line' => $line]);
         } else {
-            // http://php.net/manual/en/function.debug-backtrace.php
-            // As of 5.3.6, DEBUG_BACKTRACE_IGNORE_ARGS option was added.
-            // Any version less than 5.3.6 must use the DEBUG_BACKTRACE_IGNORE_ARGS constant value '2'.
-            $trace = debug_backtrace((PHP_VERSION_ID < 50306) ? 2 : DEBUG_BACKTRACE_IGNORE_ARGS);
+            $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
             array_shift($trace); // Exclude handleError from trace
             $this->lastFatalTrace = $trace;
         }
@@ -172,6 +200,8 @@ class ErrorHandler
         } elseif ($this->previousErrorHandler) {
             return call_user_func($this->previousErrorHandler, $code, $message, $file, $line, $context);
         }
+
+        return true;
     }
 
     /**
@@ -179,27 +209,25 @@ class ErrorHandler
      */
     public function handleFatalError()
     {
-        $this->reservedMemory = null;
+        $this->reservedMemory = '';
 
         $lastError = error_get_last();
         if ($lastError && in_array($lastError['type'], self::$fatalErrors, true)) {
             $this->logger->log(
                 $this->fatalLevel === null ? LogLevel::ALERT : $this->fatalLevel,
                 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'],
-                array('code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $this->lastFatalTrace)
+                ['code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $this->lastFatalTrace]
             );
 
             if ($this->logger instanceof Logger) {
                 foreach ($this->logger->getHandlers() as $handler) {
-                    if ($handler instanceof AbstractHandler) {
-                        $handler->close();
-                    }
+                    $handler->close();
                 }
             }
         }
     }
 
-    private static function codeToString($code)
+    private static function codeToString($code): string
     {
         switch ($code) {
             case E_ERROR:
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php
index 9beda1e..2b4d649 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -23,7 +23,7 @@ class ChromePHPFormatter implements FormatterInterface
     /**
      * Translates Monolog log levels to Wildfire levels.
      */
-    private $logLevels = array(
+    private $logLevels = [
         Logger::DEBUG     => 'log',
         Logger::INFO      => 'info',
         Logger::NOTICE    => 'info',
@@ -32,7 +32,7 @@ class ChromePHPFormatter implements FormatterInterface
         Logger::CRITICAL  => 'error',
         Logger::ALERT     => 'error',
         Logger::EMERGENCY => 'error',
-    );
+    ];
 
     /**
      * {@inheritdoc}
@@ -46,7 +46,7 @@ class ChromePHPFormatter implements FormatterInterface
             unset($record['extra']['file'], $record['extra']['line']);
         }
 
-        $message = array('message' => $record['message']);
+        $message = ['message' => $record['message']];
         if ($record['context']) {
             $message['context'] = $record['context'];
         }
@@ -57,17 +57,20 @@ class ChromePHPFormatter implements FormatterInterface
             $message = reset($message);
         }
 
-        return array(
+        return [
             $record['channel'],
             $message,
             $backtrace,
             $this->logLevels[$record['level']],
-        );
+        ];
     }
 
+    /**
+     * {@inheritdoc}
+     */
     public function formatBatch(array $records)
     {
-        $formatted = array();
+        $formatted = [];
 
         foreach ($records as $record) {
             $formatted[] = $this->format($record);
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php
index 4c556cf..c6f3c8e 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -34,7 +34,7 @@ class ElasticaFormatter extends NormalizerFormatter
      * @param string $index Elastic Search index name
      * @param string $type  Elastic Search document type
      */
-    public function __construct($index, $type)
+    public function __construct(string $index, string $type)
     {
         // elasticsearch requires a ISO 8601 format date with optional millisecond precision.
         parent::__construct('Y-m-d\TH:i:s.uP');
@@ -53,31 +53,22 @@ class ElasticaFormatter extends NormalizerFormatter
         return $this->getDocument($record);
     }
 
-    /**
-     * Getter index
-     * @return string
-     */
-    public function getIndex()
+    public function getIndex(): string
     {
         return $this->index;
     }
 
-    /**
-     * Getter type
-     * @return string
-     */
-    public function getType()
+    public function getType(): string
     {
         return $this->type;
     }
 
     /**
      * Convert a log message into an Elastica Document
-     *
-     * @param  array    $record Log message
+     * @param  array    $record
      * @return Document
      */
-    protected function getDocument($record)
+    protected function getDocument(array $record): Document
     {
         $document = new Document();
         $document->setData($record);
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php
index 5094af3..301b74b 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -28,11 +28,7 @@ class FlowdockFormatter implements FormatterInterface
      */
     private $sourceEmail;
 
-    /**
-     * @param string $source
-     * @param string $sourceEmail
-     */
-    public function __construct($source, $sourceEmail)
+    public function __construct(string $source, string $sourceEmail)
     {
         $this->source = $source;
         $this->sourceEmail = $sourceEmail;
@@ -41,13 +37,13 @@ class FlowdockFormatter implements FormatterInterface
     /**
      * {@inheritdoc}
      */
-    public function format(array $record)
+    public function format(array $record): array
     {
-        $tags = array(
+        $tags = [
             '#logs',
             '#' . strtolower($record['level_name']),
             '#' . $record['channel'],
-        );
+        ];
 
         foreach ($record['extra'] as $value) {
             $tags[] = '#' . $value;
@@ -60,14 +56,14 @@ class FlowdockFormatter implements FormatterInterface
             $this->getShortMessage($record['message'])
         );
 
-        $record['flowdock'] = array(
+        $record['flowdock'] = [
             'source' => $this->source,
             'from_address' => $this->sourceEmail,
             'subject' => $subject,
             'content' => $record['message'],
             'tags' => $tags,
             'project' => $this->source,
-        );
+        ];
 
         return $record;
     }
@@ -75,9 +71,9 @@ class FlowdockFormatter implements FormatterInterface
     /**
      * {@inheritdoc}
      */
-    public function formatBatch(array $records)
+    public function formatBatch(array $records): array
     {
-        $formatted = array();
+        $formatted = [];
 
         foreach ($records as $record) {
             $formatted[] = $this->format($record);
@@ -86,12 +82,7 @@ class FlowdockFormatter implements FormatterInterface
         return $formatted;
     }
 
-    /**
-     * @param string $message
-     *
-     * @return string
-     */
-    public function getShortMessage($message)
+    public function getShortMessage(string $message): string
     {
         static $hasMbString;
 
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php
index 46a91ff..29b14d3 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,6 +11,8 @@
 
 namespace Monolog\Formatter;
 
+use Monolog\Utils;
+
 /**
  * Class FluentdFormatter
  *
@@ -39,42 +41,42 @@ class FluentdFormatter implements FormatterInterface
      */
     protected $levelTag = false;
 
-    public function __construct($levelTag = false)
+    public function __construct(bool $levelTag = false)
     {
         if (!function_exists('json_encode')) {
             throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s FluentdUnixFormatter');
         }
 
-        $this->levelTag = (bool) $levelTag;
+        $this->levelTag = $levelTag;
     }
 
-    public function isUsingLevelsInTag()
+    public function isUsingLevelsInTag(): bool
     {
         return $this->levelTag;
     }
 
-    public function format(array $record)
+    public function format(array $record): string
     {
         $tag = $record['channel'];
         if ($this->levelTag) {
             $tag .= '.' . strtolower($record['level_name']);
         }
 
-        $message = array(
+        $message = [
             'message' => $record['message'],
             'context' => $record['context'],
             'extra' => $record['extra'],
-        );
+        ];
 
         if (!$this->levelTag) {
             $message['level'] = $record['level'];
             $message['level_name'] = $record['level_name'];
         }
 
-        return json_encode(array($tag, $record['datetime']->getTimestamp(), $message));
+        return Utils::jsonEncode([$tag, $record['datetime']->getTimestamp(), $message]);
     }
 
-    public function formatBatch(array $records)
+    public function formatBatch(array $records): string
     {
         $message = '';
         foreach ($records as $record) {
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php b/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php
index b5de751..7442134 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php
index 2c1b0e8..271628a 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -13,16 +13,17 @@ namespace Monolog\Formatter;
 
 use Monolog\Logger;
 use Gelf\Message;
+use Monolog\Utils;
 
 /**
  * Serializes a log message to GELF
- * @see http://www.graylog2.org/about/gelf
+ * @see http://docs.graylog.org/en/latest/pages/gelf.html
  *
  * @author Matt Lehner <mlehner@gmail.com>
  */
 class GelfMessageFormatter extends NormalizerFormatter
 {
-    const DEFAULT_MAX_LENGTH = 32766;
+    protected const DEFAULT_MAX_LENGTH = 32766;
 
     /**
      * @var string the name of the system for the Gelf log message
@@ -47,7 +48,7 @@ class GelfMessageFormatter extends NormalizerFormatter
     /**
      * Translates Monolog log levels to Graylog2 log priorities.
      */
-    private $logLevels = array(
+    private $logLevels = [
         Logger::DEBUG     => 7,
         Logger::INFO      => 6,
         Logger::NOTICE    => 5,
@@ -56,15 +57,15 @@ class GelfMessageFormatter extends NormalizerFormatter
         Logger::CRITICAL  => 2,
         Logger::ALERT     => 1,
         Logger::EMERGENCY => 0,
-    );
+    ];
 
-    public function __construct($systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_', $maxLength = null)
+    public function __construct(?string $systemName = null, ?string $extraPrefix = null, string $contextPrefix = 'ctxt_', ?int $maxLength = null)
     {
         parent::__construct('U.u');
 
-        $this->systemName = $systemName ?: gethostname();
+        $this->systemName = (is_null($systemName) || $systemName === '') ? gethostname() : $systemName;
 
-        $this->extraPrefix = $extraPrefix;
+        $this->extraPrefix = is_null($extraPrefix) ? '' : $extraPrefix;
         $this->contextPrefix = $contextPrefix;
         $this->maxLength = is_null($maxLength) ? self::DEFAULT_MAX_LENGTH : $maxLength;
     }
@@ -72,9 +73,14 @@ class GelfMessageFormatter extends NormalizerFormatter
     /**
      * {@inheritdoc}
      */
-    public function format(array $record)
+    public function format(array $record): Message
     {
-        $record = parent::format($record);
+        if (isset($record['context'])) {
+            $record['context'] = parent::format($record['context']);
+        }
+        if (isset($record['extra'])) {
+            $record['extra'] = parent::format($record['extra']);
+        }
 
         if (!isset($record['datetime'], $record['message'], $record['level'])) {
             throw new \InvalidArgumentException('The record should at least contain datetime, message and level keys, '.var_export($record, true).' given');
@@ -87,11 +93,11 @@ class GelfMessageFormatter extends NormalizerFormatter
             ->setHost($this->systemName)
             ->setLevel($this->logLevels[$record['level']]);
 
-        // message length + system name length + 200 for padding / metadata 
+        // message length + system name length + 200 for padding / metadata
         $len = 200 + strlen((string) $record['message']) + strlen($this->systemName);
 
         if ($len > $this->maxLength) {
-            $message->setShortMessage(substr($record['message'], 0, $this->maxLength));
+            $message->setShortMessage(Utils::substr($record['message'], 0, $this->maxLength));
         }
 
         if (isset($record['channel'])) {
@@ -110,8 +116,9 @@ class GelfMessageFormatter extends NormalizerFormatter
             $val = is_scalar($val) || null === $val ? $val : $this->toJson($val);
             $len = strlen($this->extraPrefix . $key . $val);
             if ($len > $this->maxLength) {
-                $message->setAdditional($this->extraPrefix . $key, substr($val, 0, $this->maxLength));
-                break;
+                $message->setAdditional($this->extraPrefix . $key, Utils::substr($val, 0, $this->maxLength));
+
+                continue;
             }
             $message->setAdditional($this->extraPrefix . $key, $val);
         }
@@ -120,8 +127,9 @@ class GelfMessageFormatter extends NormalizerFormatter
             $val = is_scalar($val) || null === $val ? $val : $this->toJson($val);
             $len = strlen($this->contextPrefix . $key . $val);
             if ($len > $this->maxLength) {
-                $message->setAdditional($this->contextPrefix . $key, substr($val, 0, $this->maxLength));
-                break;
+                $message->setAdditional($this->contextPrefix . $key, Utils::substr($val, 0, $this->maxLength));
+
+                continue;
             }
             $message->setAdditional($this->contextPrefix . $key, $val);
         }
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php
index dfc0b4a..d82dfb2 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php
@@ -1,4 +1,5 @@
-<?php
+<?php declare(strict_types=1);
+
 /*
  * This file is part of the Monolog package.
  *
@@ -11,6 +12,7 @@
 namespace Monolog\Formatter;
 
 use Monolog\Logger;
+use Monolog\Utils;
 
 /**
  * Formats incoming records into an HTML table
@@ -24,7 +26,7 @@ class HtmlFormatter extends NormalizerFormatter
     /**
      * Translates Monolog log levels to html color priorities.
      */
-    protected $logLevels = array(
+    protected $logLevels = [
         Logger::DEBUG     => '#cccccc',
         Logger::INFO      => '#468847',
         Logger::NOTICE    => '#3a87ad',
@@ -33,12 +35,12 @@ class HtmlFormatter extends NormalizerFormatter
         Logger::CRITICAL  => '#FF7708',
         Logger::ALERT     => '#C12A19',
         Logger::EMERGENCY => '#000000',
-    );
+    ];
 
     /**
-     * @param string $dateFormat The format of the timestamp: one supported by DateTime::format
+     * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format
      */
-    public function __construct($dateFormat = null)
+    public function __construct(?string $dateFormat = null)
     {
         parent::__construct($dateFormat);
     }
@@ -46,12 +48,11 @@ class HtmlFormatter extends NormalizerFormatter
     /**
      * Creates an HTML table row
      *
-     * @param  string $th       Row header content
-     * @param  string $td       Row standard cell content
-     * @param  bool   $escapeTd false if td content must not be html escaped
-     * @return string
+     * @param string $th       Row header content
+     * @param string $td       Row standard cell content
+     * @param bool   $escapeTd false if td content must not be html escaped
      */
-    protected function addRow($th, $td = ' ', $escapeTd = true)
+    protected function addRow(string $th, string $td = ' ', bool $escapeTd = true): string
     {
         $th = htmlspecialchars($th, ENT_NOQUOTES, 'UTF-8');
         if ($escapeTd) {
@@ -68,7 +69,7 @@ class HtmlFormatter extends NormalizerFormatter
      * @param  int    $level Error level
      * @return string
      */
-    protected function addTitle($title, $level)
+    protected function addTitle(string $title, int $level): string
     {
         $title = htmlspecialchars($title, ENT_NOQUOTES, 'UTF-8');
 
@@ -78,21 +79,21 @@ class HtmlFormatter extends NormalizerFormatter
     /**
      * Formats a log record.
      *
-     * @param  array $record A record to format
-     * @return mixed The formatted record
+     * @param  array  $record A record to format
+     * @return string The formatted record
      */
-    public function format(array $record)
+    public function format(array $record): string
     {
         $output = $this->addTitle($record['level_name'], $record['level']);
         $output .= '<table cellspacing="1" width="100%" class="monolog-output">';
 
         $output .= $this->addRow('Message', (string) $record['message']);
-        $output .= $this->addRow('Time', $record['datetime']->format($this->dateFormat));
+        $output .= $this->addRow('Time', $this->formatDate($record['datetime']));
         $output .= $this->addRow('Channel', $record['channel']);
         if ($record['context']) {
             $embeddedTable = '<table cellspacing="1" width="100%">';
             foreach ($record['context'] as $key => $value) {
-                $embeddedTable .= $this->addRow($key, $this->convertToString($value));
+                $embeddedTable .= $this->addRow((string)$key, $this->convertToString($value));
             }
             $embeddedTable .= '</table>';
             $output .= $this->addRow('Context', $embeddedTable, false);
@@ -100,7 +101,7 @@ class HtmlFormatter extends NormalizerFormatter
         if ($record['extra']) {
             $embeddedTable = '<table cellspacing="1" width="100%">';
             foreach ($record['extra'] as $key => $value) {
-                $embeddedTable .= $this->addRow($key, $this->convertToString($value));
+                $embeddedTable .= $this->addRow((string)$key, $this->convertToString($value));
             }
             $embeddedTable .= '</table>';
             $output .= $this->addRow('Extra', $embeddedTable, false);
@@ -112,10 +113,10 @@ class HtmlFormatter extends NormalizerFormatter
     /**
      * Formats a set of log records.
      *
-     * @param  array $records A set of records to format
-     * @return mixed The formatted set of records
+     * @param  array  $records A set of records to format
+     * @return string The formatted set of records
      */
-    public function formatBatch(array $records)
+    public function formatBatch(array $records): string
     {
         $message = '';
         foreach ($records as $record) {
@@ -125,17 +126,14 @@ class HtmlFormatter extends NormalizerFormatter
         return $message;
     }
 
-    protected function convertToString($data)
+    protected function convertToString($data): string
     {
         if (null === $data || is_scalar($data)) {
             return (string) $data;
         }
 
         $data = $this->normalize($data);
-        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
-            return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
-        }
 
-        return str_replace('\\/', '/', json_encode($data));
+        return Utils::jsonEncode($data, JSON_PRETTY_PRINT | Utils::DEFAULT_JSON_FLAGS, true);
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php
index 9bd305f..e7e80ca 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,7 +11,6 @@
 
 namespace Monolog\Formatter;
 
-use Exception;
 use Monolog\Utils;
 use Throwable;
 
@@ -24,8 +23,8 @@ use Throwable;
  */
 class JsonFormatter extends NormalizerFormatter
 {
-    const BATCH_MODE_JSON = 1;
-    const BATCH_MODE_NEWLINES = 2;
+    public const BATCH_MODE_JSON = 1;
+    public const BATCH_MODE_NEWLINES = 2;
 
     protected $batchMode;
     protected $appendNewline;
@@ -35,11 +34,7 @@ class JsonFormatter extends NormalizerFormatter
      */
     protected $includeStacktraces = false;
 
-    /**
-     * @param int $batchMode
-     * @param bool $appendNewline
-     */
-    public function __construct($batchMode = self::BATCH_MODE_JSON, $appendNewline = true)
+    public function __construct(int $batchMode = self::BATCH_MODE_JSON, bool $appendNewline = true)
     {
         $this->batchMode = $batchMode;
         $this->appendNewline = $appendNewline;
@@ -51,36 +46,42 @@ class JsonFormatter extends NormalizerFormatter
      * formatted as a JSON-encoded array. However, for
      * compatibility with some API endpoints, alternative styles
      * are available.
-     *
-     * @return int
      */
-    public function getBatchMode()
+    public function getBatchMode(): int
     {
         return $this->batchMode;
     }
 
     /**
      * True if newlines are appended to every formatted record
-     *
-     * @return bool
      */
-    public function isAppendingNewlines()
+    public function isAppendingNewlines(): bool
     {
         return $this->appendNewline;
     }
 
     /**
      * {@inheritdoc}
+     *
+     * @suppress PhanTypeComparisonToArray
      */
-    public function format(array $record)
+    public function format(array $record): string
     {
-        return $this->toJson($this->normalize($record), true) . ($this->appendNewline ? "\n" : '');
+        $normalized = $this->normalize($record);
+        if (isset($normalized['context']) && $normalized['context'] === []) {
+            $normalized['context'] = new \stdClass;
+        }
+        if (isset($normalized['extra']) && $normalized['extra'] === []) {
+            $normalized['extra'] = new \stdClass;
+        }
+
+        return $this->toJson($normalized, true) . ($this->appendNewline ? "\n" : '');
     }
 
     /**
      * {@inheritdoc}
      */
-    public function formatBatch(array $records)
+    public function formatBatch(array $records): string
     {
         switch ($this->batchMode) {
             case static::BATCH_MODE_NEWLINES:
@@ -92,21 +93,15 @@ class JsonFormatter extends NormalizerFormatter
         }
     }
 
-    /**
-     * @param bool $include
-     */
-    public function includeStacktraces($include = true)
+    public function includeStacktraces(bool $include = true)
     {
         $this->includeStacktraces = $include;
     }
 
     /**
      * Return a JSON-encoded array of records.
-     *
-     * @param  array  $records
-     * @return string
      */
-    protected function formatBatchJson(array $records)
+    protected function formatBatchJson(array $records): string
     {
         return $this->toJson($this->normalize($records), true);
     }
@@ -114,11 +109,8 @@ class JsonFormatter extends NormalizerFormatter
     /**
      * Use new lines to separate records instead of a
      * JSON-encoded array.
-     *
-     * @param  array  $records
-     * @return string
      */
-    protected function formatBatchNewlines(array $records)
+    protected function formatBatchNewlines(array $records): string
     {
         $instance = $this;
 
@@ -139,30 +131,30 @@ class JsonFormatter extends NormalizerFormatter
      *
      * @return mixed
      */
-    protected function normalize($data, $depth = 0)
+    protected function normalize($data, int $depth = 0)
     {
-        if ($depth > 9) {
-            return 'Over 9 levels deep, aborting normalization';
+        if ($depth > $this->maxNormalizeDepth) {
+            return 'Over '.$this->maxNormalizeDepth.' levels deep, aborting normalization';
         }
 
-        if (is_array($data) || $data instanceof \Traversable) {
-            $normalized = array();
+        if (is_array($data)) {
+            $normalized = [];
 
             $count = 1;
             foreach ($data as $key => $value) {
-                if ($count++ > 1000) {
-                    $normalized['...'] = 'Over 1000 items ('.count($data).' total), aborting normalization';
+                if ($count++ > $this->maxNormalizeItemCount) {
+                    $normalized['...'] = 'Over '.$this->maxNormalizeItemCount.' items ('.count($data).' total), aborting normalization';
                     break;
                 }
 
-                $normalized[$key] = $this->normalize($value, $depth+1);
+                $normalized[$key] = $this->normalize($value, $depth + 1);
             }
 
             return $normalized;
         }
 
-        if ($data instanceof Exception || $data instanceof Throwable) {
-            return $this->normalizeException($data);
+        if ($data instanceof Throwable) {
+            return $this->normalizeException($data, $depth);
         }
 
         return $data;
@@ -171,42 +163,12 @@ class JsonFormatter extends NormalizerFormatter
     /**
      * Normalizes given exception with or without its own stack trace based on
      * `includeStacktraces` property.
-     *
-     * @param Exception|Throwable $e
-     *
-     * @return array
      */
-    protected function normalizeException($e)
+    protected function normalizeException(Throwable $e, int $depth = 0): array
     {
-        // TODO 2.0 only check for Throwable
-        if (!$e instanceof Exception && !$e instanceof Throwable) {
-            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e));
-        }
-
-        $data = array(
-            'class' => Utils::getClass($e),
-            'message' => $e->getMessage(),
-            'code' => $e->getCode(),
-            'file' => $e->getFile().':'.$e->getLine(),
-        );
-
-        if ($this->includeStacktraces) {
-            $trace = $e->getTrace();
-            foreach ($trace as $frame) {
-                if (isset($frame['file'])) {
-                    $data['trace'][] = $frame['file'].':'.$frame['line'];
-                } elseif (isset($frame['function']) && $frame['function'] === '{closure}') {
-                    // We should again normalize the frames, because it might contain invalid items
-                    $data['trace'][] = $frame['function'];
-                } else {
-                    // We should again normalize the frames, because it might contain invalid items
-                    $data['trace'][] = $this->normalize($frame);
-                }
-            }
-        }
-
-        if ($previous = $e->getPrevious()) {
-            $data['previous'] = $this->normalizeException($previous);
+        $data = parent::normalizeException($e, $depth);
+        if (!$this->includeStacktraces) {
+            unset($data['trace']);
         }
 
         return $data;
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php
index f98e1a6..fa0c44b 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -23,7 +23,7 @@ use Monolog\Utils;
  */
 class LineFormatter extends NormalizerFormatter
 {
-    const SIMPLE_FORMAT = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n";
+    public const SIMPLE_FORMAT = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n";
 
     protected $format;
     protected $allowInlineLineBreaks;
@@ -31,20 +31,20 @@ class LineFormatter extends NormalizerFormatter
     protected $includeStacktraces;
 
     /**
-     * @param string $format                     The format of the message
-     * @param string $dateFormat                 The format of the timestamp: one supported by DateTime::format
-     * @param bool   $allowInlineLineBreaks      Whether to allow inline line breaks in log entries
-     * @param bool   $ignoreEmptyContextAndExtra
+     * @param string|null $format                     The format of the message
+     * @param string|null $dateFormat                 The format of the timestamp: one supported by DateTime::format
+     * @param bool        $allowInlineLineBreaks      Whether to allow inline line breaks in log entries
+     * @param bool        $ignoreEmptyContextAndExtra
      */
-    public function __construct($format = null, $dateFormat = null, $allowInlineLineBreaks = false, $ignoreEmptyContextAndExtra = false)
+    public function __construct(?string $format = null, ?string $dateFormat = null, bool $allowInlineLineBreaks = false, bool $ignoreEmptyContextAndExtra = false)
     {
-        $this->format = $format ?: static::SIMPLE_FORMAT;
+        $this->format = $format === null ? static::SIMPLE_FORMAT : $format;
         $this->allowInlineLineBreaks = $allowInlineLineBreaks;
         $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra;
         parent::__construct($dateFormat);
     }
 
-    public function includeStacktraces($include = true)
+    public function includeStacktraces(bool $include = true)
     {
         $this->includeStacktraces = $include;
         if ($this->includeStacktraces) {
@@ -52,12 +52,12 @@ class LineFormatter extends NormalizerFormatter
         }
     }
 
-    public function allowInlineLineBreaks($allow = true)
+    public function allowInlineLineBreaks(bool $allow = true)
     {
         $this->allowInlineLineBreaks = $allow;
     }
 
-    public function ignoreEmptyContextAndExtra($ignore = true)
+    public function ignoreEmptyContextAndExtra(bool $ignore = true)
     {
         $this->ignoreEmptyContextAndExtra = $ignore;
     }
@@ -65,7 +65,7 @@ class LineFormatter extends NormalizerFormatter
     /**
      * {@inheritdoc}
      */
-    public function format(array $record)
+    public function format(array $record): string
     {
         $vars = parent::format($record);
 
@@ -78,7 +78,6 @@ class LineFormatter extends NormalizerFormatter
             }
         }
 
-
         foreach ($vars['context'] as $var => $val) {
             if (false !== strpos($output, '%context.'.$var.'%')) {
                 $output = str_replace('%context.'.$var.'%', $this->stringify($val), $output);
@@ -112,7 +111,7 @@ class LineFormatter extends NormalizerFormatter
         return $output;
     }
 
-    public function formatBatch(array $records)
+    public function formatBatch(array $records): string
     {
         $message = '';
         foreach ($records as $record) {
@@ -122,34 +121,28 @@ class LineFormatter extends NormalizerFormatter
         return $message;
     }
 
-    public function stringify($value)
+    public function stringify($value): string
     {
         return $this->replaceNewlines($this->convertToString($value));
     }
 
-    protected function normalizeException($e)
+    /**
+     * @suppress PhanParamSignatureMismatch
+     */
+    protected function normalizeException(\Throwable $e, int $depth = 0): string
     {
-        // TODO 2.0 only check for Throwable
-        if (!$e instanceof \Exception && !$e instanceof \Throwable) {
-            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e));
-        }
+        $str = $this->formatException($e);
 
-        $previousText = '';
         if ($previous = $e->getPrevious()) {
             do {
-                $previousText .= ', '.Utils::getClass($previous).'(code: '.$previous->getCode().'): '.$previous->getMessage().' at '.$previous->getFile().':'.$previous->getLine();
+                $str .= "\n[previous exception] " . $this->formatException($previous);
             } while ($previous = $previous->getPrevious());
         }
 
-        $str = '[object] ('.Utils::getClass($e).'(code: '.$e->getCode().'): '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine().$previousText.')';
-        if ($this->includeStacktraces) {
-            $str .= "\n[stacktrace]\n".$e->getTraceAsString()."\n";
-        }
-
         return $str;
     }
 
-    protected function convertToString($data)
+    protected function convertToString($data): string
     {
         if (null === $data || is_bool($data)) {
             return var_export($data, true);
@@ -159,14 +152,10 @@ class LineFormatter extends NormalizerFormatter
             return (string) $data;
         }
 
-        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
-            return $this->toJson($data, true);
-        }
-
-        return str_replace('\\/', '/', @json_encode($data));
+        return $this->toJson($data, true);
     }
 
-    protected function replaceNewlines($str)
+    protected function replaceNewlines(string $str): string
     {
         if ($this->allowInlineLineBreaks) {
             if (0 === strpos($str, '{')) {
@@ -176,6 +165,31 @@ class LineFormatter extends NormalizerFormatter
             return $str;
         }
 
-        return str_replace(array("\r\n", "\r", "\n"), ' ', $str);
+        return str_replace(["\r\n", "\r", "\n"], ' ', $str);
+    }
+
+    private function formatException(\Throwable $e): string
+    {
+        $str = '[object] (' . Utils::getClass($e) . '(code: ' . $e->getCode();
+        if ($e instanceof \SoapFault) {
+            if (isset($e->faultcode)) {
+                $str .= ' faultcode: ' . $e->faultcode;
+            }
+
+            if (isset($e->faultactor)) {
+                $str .= ' faultactor: ' . $e->faultactor;
+            }
+
+            if (isset($e->detail)) {
+                $str .= ' detail: ' . $e->detail;
+            }
+        }
+        $str .= '): ' . $e->getMessage() . ' at ' . $e->getFile() . ':' . $e->getLine() . ')';
+
+        if ($this->includeStacktraces) {
+            $str .= "\n[stacktrace]\n" . $e->getTraceAsString() . "\n";
+        }
+
+        return $str;
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php
index 401859b..29841aa 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -21,10 +21,8 @@ class LogglyFormatter extends JsonFormatter
     /**
      * Overrides the default batch mode to new lines for compatibility with the
      * Loggly bulk API.
-     *
-     * @param int $batchMode
      */
-    public function __construct($batchMode = self::BATCH_MODE_NEWLINES, $appendNewline = false)
+    public function __construct(int $batchMode = self::BATCH_MODE_NEWLINES, bool $appendNewline = false)
     {
         parent::__construct($batchMode, $appendNewline);
     }
@@ -35,11 +33,11 @@ class LogglyFormatter extends JsonFormatter
      * @see https://www.loggly.com/docs/automated-parsing/#json
      * @see \Monolog\Formatter\JsonFormatter::format()
      */
-    public function format(array $record)
+    public function format(array $record): string
     {
-        if (isset($record["datetime"]) && ($record["datetime"] instanceof \DateTime)) {
+        if (isset($record["datetime"]) && ($record["datetime"] instanceof \DateTimeInterface)) {
             $record["timestamp"] = $record["datetime"]->format("Y-m-d\TH:i:s.uO");
-            // TODO 2.0 unset the 'datetime' parameter, retained for BC
+            unset($record["datetime"]);
         }
 
         return parent::format($record);
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php
index 8f83bec..563d97d 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -14,16 +14,13 @@ namespace Monolog\Formatter;
 /**
  * Serializes a log message to Logstash Event Format
  *
- * @see http://logstash.net/
- * @see https://github.com/logstash/logstash/blob/master/lib/logstash/event.rb
+ * @see https://www.elastic.co/products/logstash
+ * @see https://github.com/elastic/logstash/blob/master/logstash-core/src/main/java/org/logstash/Event.java
  *
  * @author Tim Mower <timothy.mower@gmail.com>
  */
 class LogstashFormatter extends NormalizerFormatter
 {
-    const V0 = 0;
-    const V1 = 1;
-
     /**
      * @var string the name of the system for the Logstash log message, used to fill the @source field
      */
@@ -35,108 +32,47 @@ class LogstashFormatter extends NormalizerFormatter
     protected $applicationName;
 
     /**
-     * @var string a prefix for 'extra' fields from the Monolog record (optional)
+     * @var string the key for 'extra' fields from the Monolog record
      */
-    protected $extraPrefix;
+    protected $extraKey;
 
     /**
-     * @var string a prefix for 'context' fields from the Monolog record (optional)
+     * @var string the key for 'context' fields from the Monolog record
      */
-    protected $contextPrefix;
+    protected $contextKey;
 
     /**
-     * @var int logstash format version to use
+     * @param string      $applicationName The application that sends the data, used as the "type" field of logstash
+     * @param string|null $systemName      The system/machine name, used as the "source" field of logstash, defaults to the hostname of the machine
+     * @param string      $extraKey        The key for extra keys inside logstash "fields", defaults to extra
+     * @param string      $contextKey      The key for context keys inside logstash "fields", defaults to context
      */
-    protected $version;
-
-    /**
-     * @param string $applicationName the application that sends the data, used as the "type" field of logstash
-     * @param string $systemName      the system/machine name, used as the "source" field of logstash, defaults to the hostname of the machine
-     * @param string $extraPrefix     prefix for extra keys inside logstash "fields"
-     * @param string $contextPrefix   prefix for context keys inside logstash "fields", defaults to ctxt_
-     * @param int    $version         the logstash format version to use, defaults to 0
-     */
-    public function __construct($applicationName, $systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_', $version = self::V0)
+    public function __construct(string $applicationName, ?string $systemName = null, string $extraKey = 'extra', string $contextKey = 'context')
     {
         // logstash requires a ISO 8601 format date with optional millisecond precision.
         parent::__construct('Y-m-d\TH:i:s.uP');
 
-        $this->systemName = $systemName ?: gethostname();
+        $this->systemName = $systemName === null ? gethostname() : $systemName;
         $this->applicationName = $applicationName;
-        $this->extraPrefix = $extraPrefix;
-        $this->contextPrefix = $contextPrefix;
-        $this->version = $version;
+        $this->extraKey = $extraKey;
+        $this->contextKey = $contextKey;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function format(array $record)
+    public function format(array $record): string
     {
         $record = parent::format($record);
 
-        if ($this->version === self::V1) {
-            $message = $this->formatV1($record);
-        } else {
-            $message = $this->formatV0($record);
-        }
-
-        return $this->toJson($message) . "\n";
-    }
-
-    protected function formatV0(array $record)
-    {
         if (empty($record['datetime'])) {
             $record['datetime'] = gmdate('c');
         }
-        $message = array(
-            '@timestamp' => $record['datetime'],
-            '@source' => $this->systemName,
-            '@fields' => array(),
-        );
-        if (isset($record['message'])) {
-            $message['@message'] = $record['message'];
-        }
-        if (isset($record['channel'])) {
-            $message['@tags'] = array($record['channel']);
-            $message['@fields']['channel'] = $record['channel'];
-        }
-        if (isset($record['level'])) {
-            $message['@fields']['level'] = $record['level'];
-        }
-        if ($this->applicationName) {
-            $message['@type'] = $this->applicationName;
-        }
-        if (isset($record['extra']['server'])) {
-            $message['@source_host'] = $record['extra']['server'];
-        }
-        if (isset($record['extra']['url'])) {
-            $message['@source_path'] = $record['extra']['url'];
-        }
-        if (!empty($record['extra'])) {
-            foreach ($record['extra'] as $key => $val) {
-                $message['@fields'][$this->extraPrefix . $key] = $val;
-            }
-        }
-        if (!empty($record['context'])) {
-            foreach ($record['context'] as $key => $val) {
-                $message['@fields'][$this->contextPrefix . $key] = $val;
-            }
-        }
-
-        return $message;
-    }
-
-    protected function formatV1(array $record)
-    {
-        if (empty($record['datetime'])) {
-            $record['datetime'] = gmdate('c');
-        }
-        $message = array(
+        $message = [
             '@timestamp' => $record['datetime'],
             '@version' => 1,
             'host' => $this->systemName,
-        );
+        ];
         if (isset($record['message'])) {
             $message['message'] = $record['message'];
         }
@@ -147,20 +83,19 @@ class LogstashFormatter extends NormalizerFormatter
         if (isset($record['level_name'])) {
             $message['level'] = $record['level_name'];
         }
+        if (isset($record['level'])) {
+            $message['monolog_level'] = $record['level'];
+        }
         if ($this->applicationName) {
             $message['type'] = $this->applicationName;
         }
         if (!empty($record['extra'])) {
-            foreach ($record['extra'] as $key => $val) {
-                $message[$this->extraPrefix . $key] = $val;
-            }
+            $message[$this->extraKey] = $record['extra'];
         }
         if (!empty($record['context'])) {
-            foreach ($record['context'] as $key => $val) {
-                $message[$this->contextPrefix . $key] = $val;
-            }
+            $message[$this->contextKey] = $record['context'];
         }
 
-        return $message;
+        return $this->toJson($message) . "\n";
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php
index eb7be84..9d41a50 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,6 +11,7 @@
 
 namespace Monolog\Formatter;
 
+use MongoDB\BSON\UTCDateTime;
 use Monolog\Utils;
 
 /**
@@ -22,21 +23,24 @@ class MongoDBFormatter implements FormatterInterface
 {
     private $exceptionTraceAsString;
     private $maxNestingLevel;
+    private $isLegacyMongoExt;
 
     /**
      * @param int  $maxNestingLevel        0 means infinite nesting, the $record itself is level 1, $record['context'] is 2
      * @param bool $exceptionTraceAsString set to false to log exception traces as a sub documents instead of strings
      */
-    public function __construct($maxNestingLevel = 3, $exceptionTraceAsString = true)
+    public function __construct(int $maxNestingLevel = 3, bool $exceptionTraceAsString = true)
     {
         $this->maxNestingLevel = max($maxNestingLevel, 0);
-        $this->exceptionTraceAsString = (bool) $exceptionTraceAsString;
+        $this->exceptionTraceAsString = $exceptionTraceAsString;
+
+        $this->isLegacyMongoExt = version_compare(phpversion('mongodb'), '1.1.9', '<=');
     }
 
     /**
      * {@inheritDoc}
      */
-    public function format(array $record)
+    public function format(array $record): array
     {
         return $this->formatArray($record);
     }
@@ -44,7 +48,7 @@ class MongoDBFormatter implements FormatterInterface
     /**
      * {@inheritDoc}
      */
-    public function formatBatch(array $records)
+    public function formatBatch(array $records): array
     {
         foreach ($records as $key => $record) {
             $records[$key] = $this->format($record);
@@ -53,13 +57,16 @@ class MongoDBFormatter implements FormatterInterface
         return $records;
     }
 
-    protected function formatArray(array $record, $nestingLevel = 0)
+    /**
+     * @return array|string Array except when max nesting level is reached then a string "[...]"
+     */
+    protected function formatArray(array $record, int $nestingLevel = 0)
     {
         if ($this->maxNestingLevel == 0 || $nestingLevel <= $this->maxNestingLevel) {
             foreach ($record as $name => $value) {
-                if ($value instanceof \DateTime) {
+                if ($value instanceof \DateTimeInterface) {
                     $record[$name] = $this->formatDate($value, $nestingLevel + 1);
-                } elseif ($value instanceof \Exception) {
+                } elseif ($value instanceof \Throwable) {
                     $record[$name] = $this->formatException($value, $nestingLevel + 1);
                 } elseif (is_array($value)) {
                     $record[$name] = $this->formatArray($value, $nestingLevel + 1);
@@ -74,7 +81,7 @@ class MongoDBFormatter implements FormatterInterface
         return $record;
     }
 
-    protected function formatObject($value, $nestingLevel)
+    protected function formatObject($value, int $nestingLevel)
     {
         $objectVars = get_object_vars($value);
         $objectVars['class'] = Utils::getClass($value);
@@ -82,14 +89,14 @@ class MongoDBFormatter implements FormatterInterface
         return $this->formatArray($objectVars, $nestingLevel);
     }
 
-    protected function formatException(\Exception $exception, $nestingLevel)
+    protected function formatException(\Throwable $exception, int $nestingLevel)
     {
-        $formattedException = array(
+        $formattedException = [
             'class' => Utils::getClass($exception),
             'message' => $exception->getMessage(),
-            'code' => $exception->getCode(),
+            'code' => (int) $exception->getCode(),
             'file' => $exception->getFile() . ':' . $exception->getLine(),
-        );
+        ];
 
         if ($this->exceptionTraceAsString === true) {
             $formattedException['trace'] = $exception->getTraceAsString();
@@ -100,8 +107,35 @@ class MongoDBFormatter implements FormatterInterface
         return $this->formatArray($formattedException, $nestingLevel);
     }
 
-    protected function formatDate(\DateTime $value, $nestingLevel)
+    protected function formatDate(\DateTimeInterface $value, int $nestingLevel): UTCDateTime
+    {
+        if ($this->isLegacyMongoExt) {
+            return $this->legacyGetMongoDbDateTime($value);
+        }
+
+        return $this->getMongoDbDateTime($value);
+    }
+
+    private function getMongoDbDateTime(\DateTimeInterface $value): UTCDateTime
     {
-        return new \MongoDate($value->getTimestamp());
+        return new UTCDateTime((int) (string) floor($value->format('U.u') * 1000));
+    }
+
+    /**
+     * This is needed to support MongoDB Driver v1.19 and below
+     *
+     * See https://github.com/mongodb/mongo-php-driver/issues/426
+     *
+     * It can probably be removed in 2.1 or later once MongoDB's 1.2 is released and widely adopted
+     */
+    private function legacyGetMongoDbDateTime(\DateTimeInterface $value): UTCDateTime
+    {
+        $milliseconds = floor($value->format('U.u') * 1000);
+
+        $milliseconds = (PHP_INT_SIZE == 8) //64-bit OS?
+            ? (int) $milliseconds
+            : (string) $milliseconds;
+
+        return new UTCDateTime($milliseconds);
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php
index 6686657..fe75881 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,8 +11,9 @@
 
 namespace Monolog\Formatter;
 
-use Exception;
+use Monolog\DateTimeImmutable;
 use Monolog\Utils;
+use Throwable;
 
 /**
  * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets
@@ -21,16 +22,20 @@ use Monolog\Utils;
  */
 class NormalizerFormatter implements FormatterInterface
 {
-    const SIMPLE_DATE = "Y-m-d H:i:s";
+    public const SIMPLE_DATE = "Y-m-d\TH:i:sP";
 
     protected $dateFormat;
+    protected $maxNormalizeDepth = 9;
+    protected $maxNormalizeItemCount = 1000;
+
+    private $jsonEncodeOptions = Utils::DEFAULT_JSON_FLAGS;
 
     /**
-     * @param string $dateFormat The format of the timestamp: one supported by DateTime::format
+     * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format
      */
-    public function __construct($dateFormat = null)
+    public function __construct(?string $dateFormat = null)
     {
-        $this->dateFormat = $dateFormat ?: static::SIMPLE_DATE;
+        $this->dateFormat = null === $dateFormat ? static::SIMPLE_DATE : $dateFormat;
         if (!function_exists('json_encode')) {
             throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s NormalizerFormatter');
         }
@@ -56,10 +61,58 @@ class NormalizerFormatter implements FormatterInterface
         return $records;
     }
 
-    protected function normalize($data, $depth = 0)
+    /**
+     * The maximum number of normalization levels to go through
+     */
+    public function getMaxNormalizeDepth(): int
+    {
+        return $this->maxNormalizeDepth;
+    }
+
+    public function setMaxNormalizeDepth(int $maxNormalizeDepth): self
+    {
+        $this->maxNormalizeDepth = $maxNormalizeDepth;
+
+        return $this;
+    }
+
+    /**
+     * The maximum number of items to normalize per level
+     */
+    public function getMaxNormalizeItemCount(): int
+    {
+        return $this->maxNormalizeItemCount;
+    }
+
+    public function setMaxNormalizeItemCount(int $maxNormalizeItemCount): self
+    {
+        $this->maxNormalizeItemCount = $maxNormalizeItemCount;
+
+        return $this;
+    }
+
+    /**
+     * Enables `json_encode` pretty print.
+     */
+    public function setJsonPrettyPrint(bool $enable): self
     {
-        if ($depth > 9) {
-            return 'Over 9 levels deep, aborting normalization';
+        if ($enable) {
+            $this->jsonEncodeOptions |= JSON_PRETTY_PRINT;
+        } else {
+            $this->jsonEncodeOptions ^= JSON_PRETTY_PRINT;
+        }
+
+        return $this;
+    }
+
+    /**
+     * @param  mixed                      $data
+     * @return int|bool|string|null|array
+     */
+    protected function normalize($data, int $depth = 0)
+    {
+        if ($depth > $this->maxNormalizeDepth) {
+            return 'Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization';
         }
 
         if (null === $data || is_scalar($data)) {
@@ -76,62 +129,69 @@ class NormalizerFormatter implements FormatterInterface
         }
 
         if (is_array($data)) {
-            $normalized = array();
+            $normalized = [];
 
             $count = 1;
             foreach ($data as $key => $value) {
-                if ($count++ > 1000) {
-                    $normalized['...'] = 'Over 1000 items ('.count($data).' total), aborting normalization';
+                if ($count++ > $this->maxNormalizeItemCount) {
+                    $normalized['...'] = 'Over ' . $this->maxNormalizeItemCount . ' items ('.count($data).' total), aborting normalization';
                     break;
                 }
 
-                $normalized[$key] = $this->normalize($value, $depth+1);
+                $normalized[$key] = $this->normalize($value, $depth + 1);
             }
 
             return $normalized;
         }
 
-        if ($data instanceof \DateTime) {
-            return $data->format($this->dateFormat);
+        if ($data instanceof \DateTimeInterface) {
+            return $this->formatDate($data);
         }
 
         if (is_object($data)) {
-            // TODO 2.0 only check for Throwable
-            if ($data instanceof Exception || (PHP_VERSION_ID > 70000 && $data instanceof \Throwable)) {
-                return $this->normalizeException($data);
+            if ($data instanceof Throwable) {
+                return $this->normalizeException($data, $depth);
             }
 
-            // non-serializable objects that implement __toString stringified
-            if (method_exists($data, '__toString') && !$data instanceof \JsonSerializable) {
+            if ($data instanceof \JsonSerializable) {
+                $value = $data->jsonSerialize();
+            } elseif (method_exists($data, '__toString')) {
                 $value = $data->__toString();
             } else {
-                // the rest is json-serialized in some way
-                $value = $this->toJson($data, true);
+                // the rest is normalized by json encoding and decoding it
+                $encoded = $this->toJson($data, true);
+                if ($encoded === false) {
+                    $value = 'JSON_ERROR';
+                } else {
+                    $value = json_decode($encoded, true);
+                }
             }
 
-            return sprintf("[object] (%s: %s)", Utils::getClass($data), $value);
+            return [Utils::getClass($data) => $value];
         }
 
         if (is_resource($data)) {
-            return sprintf('[resource] (%s)', get_resource_type($data));
+            return sprintf('[resource(%s)]', get_resource_type($data));
         }
 
         return '[unknown('.gettype($data).')]';
     }
 
-    protected function normalizeException($e)
+    /**
+     * @return array
+     */
+    protected function normalizeException(Throwable $e, int $depth = 0)
     {
-        // TODO 2.0 only check for Throwable
-        if (!$e instanceof Exception && !$e instanceof \Throwable) {
-            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e));
+        if ($e instanceof \JsonSerializable) {
+            return (array) $e->jsonSerialize();
         }
 
-        $data = array(
+        $data = [
             'class' => Utils::getClass($e),
             'message' => $e->getMessage(),
-            'code' => $e->getCode(),
+            'code' => (int) $e->getCode(),
             'file' => $e->getFile().':'.$e->getLine(),
-        );
+        ];
 
         if ($e instanceof \SoapFault) {
             if (isset($e->faultcode)) {
@@ -142,8 +202,8 @@ class NormalizerFormatter implements FormatterInterface
                 $data['faultactor'] = $e->faultactor;
             }
 
-            if (isset($e->detail)) {
-                $data['detail'] = $e->detail;
+            if (isset($e->detail) && (is_string($e->detail) || is_object($e->detail) || is_array($e->detail))) {
+                $data['detail'] = is_string($e->detail) ? $e->detail : reset($e->detail);
             }
         }
 
@@ -151,28 +211,11 @@ class NormalizerFormatter implements FormatterInterface
         foreach ($trace as $frame) {
             if (isset($frame['file'])) {
                 $data['trace'][] = $frame['file'].':'.$frame['line'];
-            } elseif (isset($frame['function']) && $frame['function'] === '{closure}') {
-                // Simplify closures handling
-                $data['trace'][] = $frame['function'];
-            } else {
-                if (isset($frame['args'])) {
-                    // Make sure that objects present as arguments are not serialized nicely but rather only
-                    // as a class name to avoid any unexpected leak of sensitive information
-                    $frame['args'] = array_map(function ($arg) {
-                        if (is_object($arg) && !($arg instanceof \DateTime || $arg instanceof \DateTimeInterface)) {
-                            return sprintf("[object] (%s)", Utils::getClass($arg));
-                        }
-
-                        return $arg;
-                    }, $frame['args']);
-                }
-                // We should again normalize the frames, because it might contain invalid items
-                $data['trace'][] = $this->toJson($this->normalize($frame), true);
             }
         }
 
         if ($previous = $e->getPrevious()) {
-            $data['previous'] = $this->normalizeException($previous);
+            $data['previous'] = $this->normalizeException($previous, $depth + 1);
         }
 
         return $data;
@@ -182,133 +225,32 @@ class NormalizerFormatter implements FormatterInterface
      * Return the JSON representation of a value
      *
      * @param  mixed             $data
-     * @param  bool              $ignoreErrors
      * @throws \RuntimeException if encoding fails and errors are not ignored
-     * @return string
+     * @return string if encoding fails and ignoreErrors is true 'null' is returned
      */
-    protected function toJson($data, $ignoreErrors = false)
+    protected function toJson($data, bool $ignoreErrors = false): string
     {
-        // suppress json_encode errors since it's twitchy with some inputs
-        if ($ignoreErrors) {
-            return @$this->jsonEncode($data);
-        }
-
-        $json = $this->jsonEncode($data);
-
-        if ($json === false) {
-            $json = $this->handleJsonError(json_last_error(), $data);
-        }
-
-        return $json;
+        return Utils::jsonEncode($data, $this->jsonEncodeOptions, $ignoreErrors);
     }
 
-    /**
-     * @param  mixed  $data
-     * @return string JSON encoded data or null on failure
-     */
-    private function jsonEncode($data)
+    protected function formatDate(\DateTimeInterface $date)
     {
-        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
-            return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
+        // in case the date format isn't custom then we defer to the custom DateTimeImmutable
+        // formatting logic, which will pick the right format based on whether useMicroseconds is on
+        if ($this->dateFormat === self::SIMPLE_DATE && $date instanceof DateTimeImmutable) {
+            return (string) $date;
         }
 
-        return json_encode($data);
+        return $date->format($this->dateFormat);
     }
 
-    /**
-     * Handle a json_encode failure.
-     *
-     * If the failure is due to invalid string encoding, try to clean the
-     * input and encode again. If the second encoding attempt fails, the
-     * inital error is not encoding related or the input can't be cleaned then
-     * raise a descriptive exception.
-     *
-     * @param  int               $code return code of json_last_error function
-     * @param  mixed             $data data that was meant to be encoded
-     * @throws \RuntimeException if failure can't be corrected
-     * @return string            JSON encoded data after error correction
-     */
-    private function handleJsonError($code, $data)
+    protected function addJsonEncodeOption($option)
     {
-        if ($code !== JSON_ERROR_UTF8) {
-            $this->throwEncodeError($code, $data);
-        }
-
-        if (is_string($data)) {
-            $this->detectAndCleanUtf8($data);
-        } elseif (is_array($data)) {
-            array_walk_recursive($data, array($this, 'detectAndCleanUtf8'));
-        } else {
-            $this->throwEncodeError($code, $data);
-        }
-
-        $json = $this->jsonEncode($data);
-
-        if ($json === false) {
-            $this->throwEncodeError(json_last_error(), $data);
-        }
-
-        return $json;
-    }
-
-    /**
-     * Throws an exception according to a given code with a customized message
-     *
-     * @param  int               $code return code of json_last_error function
-     * @param  mixed             $data data that was meant to be encoded
-     * @throws \RuntimeException
-     */
-    private function throwEncodeError($code, $data)
-    {
-        switch ($code) {
-            case JSON_ERROR_DEPTH:
-                $msg = 'Maximum stack depth exceeded';
-                break;
-            case JSON_ERROR_STATE_MISMATCH:
-                $msg = 'Underflow or the modes mismatch';
-                break;
-            case JSON_ERROR_CTRL_CHAR:
-                $msg = 'Unexpected control character found';
-                break;
-            case JSON_ERROR_UTF8:
-                $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded';
-                break;
-            default:
-                $msg = 'Unknown error';
-        }
-
-        throw new \RuntimeException('JSON encoding failed: '.$msg.'. Encoding: '.var_export($data, true));
+        $this->jsonEncodeOptions |= $option;
     }
 
-    /**
-     * Detect invalid UTF-8 string characters and convert to valid UTF-8.
-     *
-     * Valid UTF-8 input will be left unmodified, but strings containing
-     * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed
-     * original encoding of ISO-8859-15. This conversion may result in
-     * incorrect output if the actual encoding was not ISO-8859-15, but it
-     * will be clean UTF-8 output and will not rely on expensive and fragile
-     * detection algorithms.
-     *
-     * Function converts the input in place in the passed variable so that it
-     * can be used as a callback for array_walk_recursive.
-     *
-     * @param mixed &$data Input to check and convert if needed
-     * @private
-     */
-    public function detectAndCleanUtf8(&$data)
+    protected function removeJsonEncodeOption($option)
     {
-        if (is_string($data) && !preg_match('//u', $data)) {
-            $data = preg_replace_callback(
-                '/[\x80-\xFF]+/',
-                function ($m) { return utf8_encode($m[0]); },
-                $data
-            );
-            $data = str_replace(
-                array('¤', '¦', '¨', '´', '¸', '¼', '½', '¾'),
-                array('€', 'Š', 'š', 'Ž', 'ž', 'Œ', 'œ', 'Ÿ'),
-                $data
-            );
-        }
+        $this->jsonEncodeOptions ^= $option;
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php
index 5d345d5..8d560e7 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -22,7 +22,7 @@ class ScalarFormatter extends NormalizerFormatter
     /**
      * {@inheritdoc}
      */
-    public function format(array $record)
+    public function format(array $record): array
     {
         foreach ($record as $key => $value) {
             $record[$key] = $this->normalizeValue($value);
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php
index 65dba99..2d96739 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -22,12 +22,10 @@ use Monolog\Logger;
  */
 class WildfireFormatter extends NormalizerFormatter
 {
-    const TABLE = 'table';
-
     /**
      * Translates Monolog log levels to Wildfire levels.
      */
-    private $logLevels = array(
+    private $logLevels = [
         Logger::DEBUG     => 'LOG',
         Logger::INFO      => 'INFO',
         Logger::NOTICE    => 'INFO',
@@ -36,12 +34,12 @@ class WildfireFormatter extends NormalizerFormatter
         Logger::CRITICAL  => 'ERROR',
         Logger::ALERT     => 'ERROR',
         Logger::EMERGENCY => 'ERROR',
-    );
+    ];
 
     /**
      * {@inheritdoc}
      */
-    public function format(array $record)
+    public function format(array $record): string
     {
         // Retrieve the line and file if set and remove them from the formatted extra
         $file = $line = '';
@@ -55,7 +53,7 @@ class WildfireFormatter extends NormalizerFormatter
         }
 
         $record = $this->normalize($record);
-        $message = array('message' => $record['message']);
+        $message = ['message' => $record['message']];
         $handleError = false;
         if ($record['context']) {
             $message['context'] = $record['context'];
@@ -69,42 +67,49 @@ class WildfireFormatter extends NormalizerFormatter
             $message = reset($message);
         }
 
-        if (isset($record['context'][self::TABLE])) {
+        if (isset($record['context']['table'])) {
             $type  = 'TABLE';
             $label = $record['channel'] .': '. $record['message'];
-            $message = $record['context'][self::TABLE];
+            $message = $record['context']['table'];
         } else {
             $type  = $this->logLevels[$record['level']];
             $label = $record['channel'];
         }
 
         // Create JSON object describing the appearance of the message in the console
-        $json = $this->toJson(array(
-            array(
+        $json = $this->toJson([
+            [
                 'Type'  => $type,
                 'File'  => $file,
                 'Line'  => $line,
                 'Label' => $label,
-            ),
+            ],
             $message,
-        ), $handleError);
+        ], $handleError);
 
         // The message itself is a serialization of the above JSON object + it's length
         return sprintf(
-            '%s|%s|',
+            '%d|%s|',
             strlen($json),
             $json
         );
     }
 
+    /**
+     * {@inheritdoc}
+     */
     public function formatBatch(array $records)
     {
         throw new \BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter');
     }
 
-    protected function normalize($data, $depth = 0)
+    /**
+     * {@inheritdoc}
+     * @suppress PhanTypeMismatchReturn
+     */
+    protected function normalize($data, int $depth = 0)
     {
-        if (is_object($data) && !$data instanceof \DateTime) {
+        if (is_object($data) && !$data instanceof \DateTimeInterface) {
             return $data;
         }
 
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php
index 92b9d45..c9405bf 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,32 +11,24 @@
 
 namespace Monolog\Handler;
 
-use Monolog\Formatter\FormatterInterface;
-use Monolog\Formatter\LineFormatter;
 use Monolog\Logger;
 use Monolog\ResettableInterface;
 
 /**
- * Base Handler class providing the Handler structure
+ * Base Handler class providing basic level/bubble support
  *
  * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-abstract class AbstractHandler implements HandlerInterface, ResettableInterface
+abstract class AbstractHandler extends Handler implements ResettableInterface
 {
     protected $level = Logger::DEBUG;
     protected $bubble = true;
 
     /**
-     * @var FormatterInterface
+     * @param int|string $level  The minimum logging level at which this handler will be triggered
+     * @param bool       $bubble Whether the messages that are handled can bubble up the stack or not
      */
-    protected $formatter;
-    protected $processors = array();
-
-    /**
-     * @param int  $level  The minimum logging level at which this handler will be triggered
-     * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
-     */
-    public function __construct($level = Logger::DEBUG, $bubble = true)
+    public function __construct($level = Logger::DEBUG, bool $bubble = true)
     {
         $this->setLevel($level);
         $this->bubble = $bubble;
@@ -45,84 +37,18 @@ abstract class AbstractHandler implements HandlerInterface, ResettableInterface
     /**
      * {@inheritdoc}
      */
-    public function isHandling(array $record)
+    public function isHandling(array $record): bool
     {
         return $record['level'] >= $this->level;
     }
 
     /**
-     * {@inheritdoc}
-     */
-    public function handleBatch(array $records)
-    {
-        foreach ($records as $record) {
-            $this->handle($record);
-        }
-    }
-
-    /**
-     * Closes the handler.
-     *
-     * This will be called automatically when the object is destroyed
-     */
-    public function close()
-    {
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function pushProcessor($callback)
-    {
-        if (!is_callable($callback)) {
-            throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given');
-        }
-        array_unshift($this->processors, $callback);
-
-        return $this;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function popProcessor()
-    {
-        if (!$this->processors) {
-            throw new \LogicException('You tried to pop from an empty processor stack.');
-        }
-
-        return array_shift($this->processors);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function setFormatter(FormatterInterface $formatter)
-    {
-        $this->formatter = $formatter;
-
-        return $this;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getFormatter()
-    {
-        if (!$this->formatter) {
-            $this->formatter = $this->getDefaultFormatter();
-        }
-
-        return $this->formatter;
-    }
-
-    /**
      * Sets minimum logging level at which this handler will be triggered.
      *
      * @param  int|string $level Level or level name
      * @return self
      */
-    public function setLevel($level)
+    public function setLevel($level): self
     {
         $this->level = Logger::toMonologLevel($level);
 
@@ -134,7 +60,7 @@ abstract class AbstractHandler implements HandlerInterface, ResettableInterface
      *
      * @return int
      */
-    public function getLevel()
+    public function getLevel(): int
     {
         return $this->level;
     }
@@ -146,7 +72,7 @@ abstract class AbstractHandler implements HandlerInterface, ResettableInterface
      *                      false means that bubbling is not permitted.
      * @return self
      */
-    public function setBubble($bubble)
+    public function setBubble(bool $bubble): self
     {
         $this->bubble = $bubble;
 
@@ -159,38 +85,12 @@ abstract class AbstractHandler implements HandlerInterface, ResettableInterface
      * @return bool true means that this handler allows bubbling.
      *              false means that bubbling is not permitted.
      */
-    public function getBubble()
+    public function getBubble(): bool
     {
         return $this->bubble;
     }
 
-    public function __destruct()
-    {
-        try {
-            $this->close();
-        } catch (\Exception $e) {
-            // do nothing
-        } catch (\Throwable $e) {
-            // do nothing
-        }
-    }
-
     public function reset()
     {
-        foreach ($this->processors as $processor) {
-            if ($processor instanceof ResettableInterface) {
-                $processor->reset();
-            }
-        }
-    }
-
-    /**
-     * Gets the default formatter.
-     *
-     * @return FormatterInterface
-     */
-    protected function getDefaultFormatter()
-    {
-        return new LineFormatter();
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php
index e1e8953..1100260 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,28 +11,31 @@
 
 namespace Monolog\Handler;
 
-use Monolog\ResettableInterface;
-
 /**
- * Base Handler class providing the Handler structure
+ * Base Handler class providing the Handler structure, including processors and formatters
  *
  * Classes extending it should (in most cases) only implement write($record)
  *
  * @author Jordi Boggiano <j.boggiano@seld.be>
  * @author Christophe Coevoet <stof@notk.org>
  */
-abstract class AbstractProcessingHandler extends AbstractHandler
+abstract class AbstractProcessingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface
 {
+    use ProcessableHandlerTrait;
+    use FormattableHandlerTrait;
+
     /**
      * {@inheritdoc}
      */
-    public function handle(array $record)
+    public function handle(array $record): bool
     {
         if (!$this->isHandling($record)) {
             return false;
         }
 
-        $record = $this->processRecord($record);
+        if ($this->processors) {
+            $record = $this->processRecord($record);
+        }
 
         $record['formatted'] = $this->getFormatter()->format($record);
 
@@ -43,26 +46,13 @@ abstract class AbstractProcessingHandler extends AbstractHandler
 
     /**
      * Writes the record down to the log of the implementing handler
-     *
-     * @param  array $record
-     * @return void
      */
-    abstract protected function write(array $record);
+    abstract protected function write(array $record): void;
 
-    /**
-     * Processes a record.
-     *
-     * @param  array $record
-     * @return array
-     */
-    protected function processRecord(array $record)
+    public function reset()
     {
-        if ($this->processors) {
-            foreach ($this->processors as $processor) {
-                $record = call_user_func($processor, $record);
-            }
-        }
+        parent::reset();
 
-        return $record;
+        $this->resetProcessors();
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php
index 8c76aca..b7f249d 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,6 +12,7 @@
 namespace Monolog\Handler;
 
 use Monolog\Logger;
+use Monolog\Formatter\FormatterInterface;
 use Monolog\Formatter\LineFormatter;
 
 /**
@@ -24,7 +25,7 @@ abstract class AbstractSyslogHandler extends AbstractProcessingHandler
     /**
      * Translates Monolog log levels to syslog log priorities.
      */
-    protected $logLevels = array(
+    protected $logLevels = [
         Logger::DEBUG     => LOG_DEBUG,
         Logger::INFO      => LOG_INFO,
         Logger::NOTICE    => LOG_NOTICE,
@@ -33,12 +34,12 @@ abstract class AbstractSyslogHandler extends AbstractProcessingHandler
         Logger::CRITICAL  => LOG_CRIT,
         Logger::ALERT     => LOG_ALERT,
         Logger::EMERGENCY => LOG_EMERG,
-    );
+    ];
 
     /**
      * List of valid log facility names.
      */
-    protected $facilities = array(
+    protected $facilities = [
         'auth'     => LOG_AUTH,
         'authpriv' => LOG_AUTHPRIV,
         'cron'     => LOG_CRON,
@@ -50,14 +51,14 @@ abstract class AbstractSyslogHandler extends AbstractProcessingHandler
         'syslog'   => LOG_SYSLOG,
         'user'     => LOG_USER,
         'uucp'     => LOG_UUCP,
-    );
+    ];
 
     /**
-     * @param mixed $facility
-     * @param int   $level The minimum logging level at which this handler will be triggered
-     * @param bool  $bubble Whether the messages that are handled can bubble up the stack or not
+     * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant
+     * @param string|int $level    The minimum logging level at which this handler will be triggered
+     * @param bool       $bubble   Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct($facility = LOG_USER, $level = Logger::DEBUG, $bubble = true)
+    public function __construct($facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true)
     {
         parent::__construct($level, $bubble);
 
@@ -82,7 +83,7 @@ abstract class AbstractSyslogHandler extends AbstractProcessingHandler
         }
 
         // convert textual description of facility to syslog constant
-        if (array_key_exists(strtolower($facility), $this->facilities)) {
+        if (is_string($facility) && array_key_exists(strtolower($facility), $this->facilities)) {
             $facility = $this->facilities[strtolower($facility)];
         } elseif (!in_array($facility, array_values($this->facilities), true)) {
             throw new \UnexpectedValueException('Unknown facility value "'.$facility.'" given');
@@ -94,7 +95,7 @@ abstract class AbstractSyslogHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new LineFormatter('%channel%.%level_name%: %message% %context% %extra%');
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php
index e5a46bc..33fffcc 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,6 +12,7 @@
 namespace Monolog\Handler;
 
 use Monolog\Logger;
+use Monolog\Formatter\FormatterInterface;
 use Monolog\Formatter\JsonFormatter;
 use PhpAmqpLib\Message\AMQPMessage;
 use PhpAmqpLib\Channel\AMQPChannel;
@@ -31,18 +32,18 @@ class AmqpHandler extends AbstractProcessingHandler
 
     /**
      * @param AMQPExchange|AMQPChannel $exchange     AMQPExchange (php AMQP ext) or PHP AMQP lib channel, ready for use
-     * @param string                   $exchangeName
-     * @param int                      $level
+     * @param string|null              $exchangeName Optional exchange name, for AMQPChannel (PhpAmqpLib) only
+     * @param string|int               $level        The minimum logging level at which this handler will be triggered
      * @param bool                     $bubble       Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct($exchange, $exchangeName = 'log', $level = Logger::DEBUG, $bubble = true)
+    public function __construct($exchange, ?string $exchangeName = null, $level = Logger::DEBUG, bool $bubble = true)
     {
-        if ($exchange instanceof AMQPExchange) {
-            $exchange->setName($exchangeName);
-        } elseif ($exchange instanceof AMQPChannel) {
-            $this->exchangeName = $exchangeName;
-        } else {
+        if ($exchange instanceof AMQPChannel) {
+            $this->exchangeName = (string) $exchangeName;
+        } elseif (!$exchange instanceof AMQPExchange) {
             throw new \InvalidArgumentException('PhpAmqpLib\Channel\AMQPChannel or AMQPExchange instance required');
+        } elseif ($exchangeName) {
+            @trigger_error('The $exchangeName parameter can only be passed when using PhpAmqpLib, if using an AMQPExchange instance configure it beforehand', E_USER_DEPRECATED);
         }
         $this->exchange = $exchange;
 
@@ -52,7 +53,7 @@ class AmqpHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         $data = $record["formatted"];
         $routingKey = $this->getRoutingKey($record);
@@ -62,10 +63,10 @@ class AmqpHandler extends AbstractProcessingHandler
                 $data,
                 $routingKey,
                 0,
-                array(
+                [
                     'delivery_mode' => 2,
                     'content_type' => 'application/json',
-                )
+                ]
             );
         } else {
             $this->exchange->basic_publish(
@@ -79,7 +80,7 @@ class AmqpHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    public function handleBatch(array $records)
+    public function handleBatch(array $records): void
     {
         if ($this->exchange instanceof AMQPExchange) {
             parent::handleBatch($records);
@@ -107,41 +108,29 @@ class AmqpHandler extends AbstractProcessingHandler
 
     /**
      * Gets the routing key for the AMQP exchange
-     *
-     * @param  array  $record
-     * @return string
      */
-    protected function getRoutingKey(array $record)
+    protected function getRoutingKey(array $record): string
     {
-        $routingKey = sprintf(
-            '%s.%s',
-            // TODO 2.0 remove substr call
-            substr($record['level_name'], 0, 4),
-            $record['channel']
-        );
+        $routingKey = sprintf('%s.%s', $record['level_name'], $record['channel']);
 
         return strtolower($routingKey);
     }
 
-    /**
-     * @param  string      $data
-     * @return AMQPMessage
-     */
-    private function createAmqpMessage($data)
+    private function createAmqpMessage(string $data): AMQPMessage
     {
         return new AMQPMessage(
-            (string) $data,
-            array(
+            $data,
+            [
                 'delivery_mode' => 2,
                 'content_type' => 'application/json',
-            )
+            ]
         );
     }
 
     /**
      * {@inheritDoc}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false);
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php
index 23cf23b..310591c 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,6 +12,8 @@
 namespace Monolog\Handler;
 
 use Monolog\Formatter\LineFormatter;
+use Monolog\Formatter\FormatterInterface;
+use Monolog\Utils;
 
 /**
  * Handler sending logs to browser's javascript console with no browser extension required
@@ -21,7 +23,7 @@ use Monolog\Formatter\LineFormatter;
 class BrowserConsoleHandler extends AbstractProcessingHandler
 {
     protected static $initialized = false;
-    protected static $records = array();
+    protected static $records = [];
 
     /**
      * {@inheritDoc}
@@ -32,7 +34,7 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
      *
      *     You can do [[blue text]]{color: blue} or [[green background]]{background-color: green; color: white}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new LineFormatter('[[%channel%]]{macro: autolabel} [[%level_name%]]{font-weight: bold} %message%');
     }
@@ -40,7 +42,7 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         // Accumulate records
         static::$records[] = $record;
@@ -56,7 +58,7 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
      * Convert records to javascript console commands and send it to the browser.
      * This method is automatically called on PHP shutdown if output is HTML or Javascript.
      */
-    public static function send()
+    public static function send(): void
     {
         $format = static::getResponseFormat();
         if ($format === 'unknown') {
@@ -73,40 +75,40 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
         }
     }
 
-    public function close()
+    public function close(): void
     {
         self::resetStatic();
     }
 
     public function reset()
     {
+        parent::reset();
+
         self::resetStatic();
     }
 
     /**
      * Forget all logged records
      */
-    public static function resetStatic()
+    public static function resetStatic(): void
     {
-        static::$records = array();
+        static::$records = [];
     }
 
     /**
      * Wrapper for register_shutdown_function to allow overriding
      */
-    protected function registerShutdownFunction()
+    protected function registerShutdownFunction(): void
     {
         if (PHP_SAPI !== 'cli') {
-            register_shutdown_function(array('Monolog\Handler\BrowserConsoleHandler', 'send'));
+            register_shutdown_function(['Monolog\Handler\BrowserConsoleHandler', 'send']);
         }
     }
 
     /**
      * Wrapper for echo to allow overriding
-     *
-     * @param string $str
      */
-    protected static function writeOutput($str)
+    protected static function writeOutput(string $str): void
     {
         echo $str;
     }
@@ -120,7 +122,7 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
      *
      * @return string One of 'js', 'html' or 'unknown'
      */
-    protected static function getResponseFormat()
+    protected static function getResponseFormat(): string
     {
         // Check content type
         foreach (headers_list() as $header) {
@@ -140,9 +142,9 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
         return 'html';
     }
 
-    private static function generateScript()
+    private static function generateScript(): string
     {
-        $script = array();
+        $script = [];
         foreach (static::$records as $record) {
             $context = static::dump('Context', $record['context']);
             $extra = static::dump('Extra', $record['extra']);
@@ -150,11 +152,12 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
             if (empty($context) && empty($extra)) {
                 $script[] = static::call_array('log', static::handleStyles($record['formatted']));
             } else {
-                $script = array_merge($script,
-                    array(static::call_array('groupCollapsed', static::handleStyles($record['formatted']))),
+                $script = array_merge(
+                    $script,
+                    [static::call_array('groupCollapsed', static::handleStyles($record['formatted']))],
                     $context,
                     $extra,
-                    array(static::call('groupEnd'))
+                    [static::call('groupEnd')]
                 );
             }
         }
@@ -162,31 +165,32 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
         return "(function (c) {if (c && c.groupCollapsed) {\n" . implode("\n", $script) . "\n}})(console);";
     }
 
-    private static function handleStyles($formatted)
+    private static function handleStyles(string $formatted): array
     {
-        $args = array(static::quote('font-weight: normal'));
+        $args = [];
         $format = '%c' . $formatted;
         preg_match_all('/\[\[(.*?)\]\]\{([^}]*)\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
 
         foreach (array_reverse($matches) as $match) {
-            $args[] = static::quote(static::handleCustomStyles($match[2][0], $match[1][0]));
             $args[] = '"font-weight: normal"';
+            $args[] = static::quote(static::handleCustomStyles($match[2][0], $match[1][0]));
 
             $pos = $match[0][1];
-            $format = substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . substr($format, $pos + strlen($match[0][0]));
+            $format = Utils::substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . Utils::substr($format, $pos + strlen($match[0][0]));
         }
 
-        array_unshift($args, static::quote($format));
+        $args[] = static::quote('font-weight: normal');
+        $args[] = static::quote($format);
 
-        return $args;
+        return array_reverse($args);
     }
 
-    private static function handleCustomStyles($style, $string)
+    private static function handleCustomStyles(string $style, string $string): string
     {
-        static $colors = array('blue', 'green', 'red', 'magenta', 'orange', 'black', 'grey');
-        static $labels = array();
+        static $colors = ['blue', 'green', 'red', 'magenta', 'orange', 'black', 'grey'];
+        static $labels = [];
 
-        return preg_replace_callback('/macro\s*:(.*?)(?:;|$)/', function ($m) use ($string, &$colors, &$labels) {
+        return preg_replace_callback('/macro\s*:(.*?)(?:;|$)/', function (array $m) use ($string, &$colors, &$labels) {
             if (trim($m[1]) === 'autolabel') {
                 // Format the string as a label with consistent auto assigned background color
                 if (!isset($labels[$string])) {
@@ -201,9 +205,9 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
         }, $style);
     }
 
-    private static function dump($title, array $dict)
+    private static function dump(string $title, array $dict): array
     {
-        $script = array();
+        $script = [];
         $dict = array_filter($dict);
         if (empty($dict)) {
             return $script;
@@ -214,26 +218,25 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
             if (empty($value)) {
                 $value = static::quote('');
             }
-            $script[] = static::call('log', static::quote('%s: %o'), static::quote($key), $value);
+            $script[] = static::call('log', static::quote('%s: %o'), static::quote((string) $key), $value);
         }
 
         return $script;
     }
 
-    private static function quote($arg)
+    private static function quote(string $arg): string
     {
         return '"' . addcslashes($arg, "\"\n\\") . '"';
     }
 
-    private static function call()
+    private static function call(...$args): string
     {
-        $args = func_get_args();
         $method = array_shift($args);
 
         return static::call_array($method, $args);
     }
 
-    private static function call_array($method, array $args)
+    private static function call_array(string $method, array $args): string
     {
         return 'c.' . $method . '(' . implode(', ', $args) . ');';
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php
index 61d1b50..7a59028 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -13,6 +13,7 @@ namespace Monolog\Handler;
 
 use Monolog\Logger;
 use Monolog\ResettableInterface;
+use Monolog\Formatter\FormatterInterface;
 
 /**
  * Buffers all records until closing the handler and then pass them as batch.
@@ -22,34 +23,36 @@ use Monolog\ResettableInterface;
  *
  * @author Christophe Coevoet <stof@notk.org>
  */
-class BufferHandler extends AbstractHandler
+class BufferHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface
 {
+    use ProcessableHandlerTrait;
+
     protected $handler;
     protected $bufferSize = 0;
     protected $bufferLimit;
     protected $flushOnOverflow;
-    protected $buffer = array();
+    protected $buffer = [];
     protected $initialized = false;
 
     /**
      * @param HandlerInterface $handler         Handler.
      * @param int              $bufferLimit     How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
-     * @param int              $level           The minimum logging level at which this handler will be triggered
+     * @param string|int       $level           The minimum logging level at which this handler will be triggered
      * @param bool             $bubble          Whether the messages that are handled can bubble up the stack or not
      * @param bool             $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded
      */
-    public function __construct(HandlerInterface $handler, $bufferLimit = 0, $level = Logger::DEBUG, $bubble = true, $flushOnOverflow = false)
+    public function __construct(HandlerInterface $handler, int $bufferLimit = 0, $level = Logger::DEBUG, bool $bubble = true, bool $flushOnOverflow = false)
     {
         parent::__construct($level, $bubble);
         $this->handler = $handler;
-        $this->bufferLimit = (int) $bufferLimit;
+        $this->bufferLimit = $bufferLimit;
         $this->flushOnOverflow = $flushOnOverflow;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function handle(array $record)
+    public function handle(array $record): bool
     {
         if ($record['level'] < $this->level) {
             return false;
@@ -57,7 +60,7 @@ class BufferHandler extends AbstractHandler
 
         if (!$this->initialized) {
             // __destructor() doesn't get called on Fatal errors
-            register_shutdown_function(array($this, 'close'));
+            register_shutdown_function([$this, 'close']);
             $this->initialized = true;
         }
 
@@ -71,9 +74,7 @@ class BufferHandler extends AbstractHandler
         }
 
         if ($this->processors) {
-            foreach ($this->processors as $processor) {
-                $record = call_user_func($processor, $record);
-            }
+            $record = $this->processRecord($record);
         }
 
         $this->buffer[] = $record;
@@ -82,7 +83,7 @@ class BufferHandler extends AbstractHandler
         return false === $this->bubble;
     }
 
-    public function flush()
+    public function flush(): void
     {
         if ($this->bufferSize === 0) {
             return;
@@ -102,18 +103,20 @@ class BufferHandler extends AbstractHandler
     /**
      * {@inheritdoc}
      */
-    public function close()
+    public function close(): void
     {
         $this->flush();
+
+        $this->handler->close();
     }
 
     /**
      * Clears the buffer without flushing any messages down to the wrapped handler.
      */
-    public function clear()
+    public function clear(): void
     {
         $this->bufferSize = 0;
-        $this->buffer = array();
+        $this->buffer = [];
     }
 
     public function reset()
@@ -122,8 +125,28 @@ class BufferHandler extends AbstractHandler
 
         parent::reset();
 
+        $this->resetProcessors();
+
         if ($this->handler instanceof ResettableInterface) {
             $this->handler->reset();
         }
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFormatter(FormatterInterface $formatter): HandlerInterface
+    {
+        $this->handler->setFormatter($formatter);
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFormatter(): FormatterInterface
+    {
+        return $this->handler->getFormatter();
+    }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php
index 37419a0..ef93f66 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,7 +12,9 @@
 namespace Monolog\Handler;
 
 use Monolog\Formatter\ChromePHPFormatter;
+use Monolog\Formatter\FormatterInterface;
 use Monolog\Logger;
+use Monolog\Utils;
 
 /**
  * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/)
@@ -23,45 +25,47 @@ use Monolog\Logger;
  */
 class ChromePHPHandler extends AbstractProcessingHandler
 {
+    use WebRequestRecognizerTrait;
+
     /**
      * Version of the extension
      */
-    const VERSION = '4.0';
+    protected const VERSION = '4.0';
 
     /**
      * Header name
      */
-    const HEADER_NAME = 'X-ChromeLogger-Data';
+    protected const HEADER_NAME = 'X-ChromeLogger-Data';
 
     /**
      * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+)
      */
-    const USER_AGENT_REGEX = '{\b(?:Chrome/\d+(?:\.\d+)*|HeadlessChrome|Firefox/(?:4[3-9]|[5-9]\d|\d{3,})(?:\.\d)*)\b}';
+    protected const USER_AGENT_REGEX = '{\b(?:Chrome/\d+(?:\.\d+)*|HeadlessChrome|Firefox/(?:4[3-9]|[5-9]\d|\d{3,})(?:\.\d)*)\b}';
 
     protected static $initialized = false;
 
     /**
      * Tracks whether we sent too much data
      *
-     * Chrome limits the headers to 256KB, so when we sent 240KB we stop sending
+     * Chrome limits the headers to 4KB, so when we sent 3KB we stop sending
      *
      * @var bool
      */
     protected static $overflowed = false;
 
-    protected static $json = array(
+    protected static $json = [
         'version' => self::VERSION,
-        'columns' => array('label', 'log', 'backtrace', 'type'),
-        'rows' => array(),
-    );
+        'columns' => ['label', 'log', 'backtrace', 'type'],
+        'rows' => [],
+    ];
 
     protected static $sendHeaders = true;
 
     /**
-     * @param int  $level  The minimum logging level at which this handler will be triggered
-     * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
+     * @param string|int $level  The minimum logging level at which this handler will be triggered
+     * @param bool       $bubble Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct($level = Logger::DEBUG, $bubble = true)
+    public function __construct($level = Logger::DEBUG, bool $bubble = true)
     {
         parent::__construct($level, $bubble);
         if (!function_exists('json_encode')) {
@@ -72,9 +76,13 @@ class ChromePHPHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    public function handleBatch(array $records)
+    public function handleBatch(array $records): void
     {
-        $messages = array();
+        if (!$this->isWebRequest()) {
+            return;
+        }
+
+        $messages = [];
 
         foreach ($records as $record) {
             if ($record['level'] < $this->level) {
@@ -93,7 +101,7 @@ class ChromePHPHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new ChromePHPFormatter();
     }
@@ -103,10 +111,13 @@ class ChromePHPHandler extends AbstractProcessingHandler
      *
      * @see sendHeader()
      * @see send()
-     * @param array $record
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
+        if (!$this->isWebRequest()) {
+            return;
+        }
+
         self::$json['rows'][] = $record['formatted'];
 
         $this->send();
@@ -117,7 +128,7 @@ class ChromePHPHandler extends AbstractProcessingHandler
      *
      * @see sendHeader()
      */
-    protected function send()
+    protected function send(): void
     {
         if (self::$overflowed || !self::$sendHeaders) {
             return;
@@ -131,40 +142,37 @@ class ChromePHPHandler extends AbstractProcessingHandler
                 return;
             }
 
-            self::$json['request_uri'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
+            self::$json['request_uri'] = $_SERVER['REQUEST_URI'] ?? '';
         }
 
-        $json = @json_encode(self::$json);
+        $json = Utils::jsonEncode(self::$json, null, true);
         $data = base64_encode(utf8_encode($json));
-        if (strlen($data) > 240 * 1024) {
+        if (strlen($data) > 3 * 1024) {
             self::$overflowed = true;
 
-            $record = array(
+            $record = [
                 'message' => 'Incomplete logs, chrome header size limit reached',
-                'context' => array(),
+                'context' => [],
                 'level' => Logger::WARNING,
                 'level_name' => Logger::getLevelName(Logger::WARNING),
                 'channel' => 'monolog',
-                'datetime' => new \DateTime(),
-                'extra' => array(),
-            );
+                'datetime' => new \DateTimeImmutable(),
+                'extra' => [],
+            ];
             self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record);
-            $json = @json_encode(self::$json);
+            $json = Utils::jsonEncode(self::$json, null, true);
             $data = base64_encode(utf8_encode($json));
         }
 
         if (trim($data) !== '') {
-            $this->sendHeader(self::HEADER_NAME, $data);
+            $this->sendHeader(static::HEADER_NAME, $data);
         }
     }
 
     /**
      * Send header string to the client
-     *
-     * @param string $header
-     * @param string $content
      */
-    protected function sendHeader($header, $content)
+    protected function sendHeader(string $header, string $content): void
     {
         if (!headers_sent() && self::$sendHeaders) {
             header(sprintf('%s: %s', $header, $content));
@@ -173,39 +181,13 @@ class ChromePHPHandler extends AbstractProcessingHandler
 
     /**
      * Verifies if the headers are accepted by the current user agent
-     *
-     * @return bool
      */
-    protected function headersAccepted()
+    protected function headersAccepted(): bool
     {
         if (empty($_SERVER['HTTP_USER_AGENT'])) {
             return false;
         }
 
-        return preg_match(self::USER_AGENT_REGEX, $_SERVER['HTTP_USER_AGENT']);
-    }
-
-    /**
-     * BC getter for the sendHeaders property that has been made static
-     */
-    public function __get($property)
-    {
-        if ('sendHeaders' !== $property) {
-            throw new \InvalidArgumentException('Undefined property '.$property);
-        }
-
-        return static::$sendHeaders;
-    }
-
-    /**
-     * BC setter for the sendHeaders property that has been made static
-     */
-    public function __set($property, $value)
-    {
-        if ('sendHeaders' !== $property) {
-            throw new \InvalidArgumentException('Undefined property '.$property);
-        }
-
-        static::$sendHeaders = $value;
+        return preg_match(static::USER_AGENT_REGEX, $_SERVER['HTTP_USER_AGENT']) === 1;
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php
index cc98697..b2d1e18 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,6 +11,7 @@
 
 namespace Monolog\Handler;
 
+use Monolog\Formatter\FormatterInterface;
 use Monolog\Formatter\JsonFormatter;
 use Monolog\Logger;
 
@@ -23,15 +24,15 @@ class CouchDBHandler extends AbstractProcessingHandler
 {
     private $options;
 
-    public function __construct(array $options = array(), $level = Logger::DEBUG, $bubble = true)
+    public function __construct(array $options = [], $level = Logger::DEBUG, bool $bubble = true)
     {
-        $this->options = array_merge(array(
+        $this->options = array_merge([
             'host'     => 'localhost',
             'port'     => 5984,
             'dbname'   => 'logger',
             'username' => null,
             'password' => null,
-        ), $options);
+        ], $options);
 
         parent::__construct($level, $bubble);
     }
@@ -39,7 +40,7 @@ class CouchDBHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         $basicAuth = null;
         if ($this->options['username']) {
@@ -47,17 +48,17 @@ class CouchDBHandler extends AbstractProcessingHandler
         }
 
         $url = 'http://'.$basicAuth.$this->options['host'].':'.$this->options['port'].'/'.$this->options['dbname'];
-        $context = stream_context_create(array(
-            'http' => array(
+        $context = stream_context_create([
+            'http' => [
                 'method'        => 'POST',
                 'content'       => $record['formatted'],
                 'ignore_errors' => true,
                 'max_redirects' => 0,
                 'header'        => 'Content-type: application/json',
-            ),
-        ));
+            ],
+        ]);
 
-        if (false === @file_get_contents($url, null, $context)) {
+        if (false === @file_get_contents($url, false, $context)) {
             throw new \RuntimeException(sprintf('Could not connect to %s', $url));
         }
     }
@@ -65,7 +66,7 @@ class CouchDBHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false);
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php
index 96b3ca0..00d38e9 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,6 +12,7 @@
 namespace Monolog\Handler;
 
 use Monolog\Logger;
+use Monolog\Utils;
 
 /**
  * Logs to Cube.
@@ -26,7 +27,7 @@ class CubeHandler extends AbstractProcessingHandler
     private $scheme;
     private $host;
     private $port;
-    private $acceptedSchemes = array('http', 'udp');
+    private $acceptedSchemes = ['http', 'udp'];
 
     /**
      * Create a Cube handler
@@ -35,7 +36,7 @@ class CubeHandler extends AbstractProcessingHandler
      *                                   A valid url must consist of three parts : protocol://host:port
      *                                   Only valid protocols used by Cube are http and udp
      */
-    public function __construct($url, $level = Logger::DEBUG, $bubble = true)
+    public function __construct(string $url, $level = Logger::DEBUG, bool $bubble = true)
     {
         $urlInfo = parse_url($url);
 
@@ -46,7 +47,8 @@ class CubeHandler extends AbstractProcessingHandler
         if (!in_array($urlInfo['scheme'], $this->acceptedSchemes)) {
             throw new \UnexpectedValueException(
                 'Invalid protocol (' . $urlInfo['scheme']  . ').'
-                . ' Valid options are ' . implode(', ', $this->acceptedSchemes));
+                . ' Valid options are ' . implode(', ', $this->acceptedSchemes)
+            );
         }
 
         $this->scheme = $urlInfo['scheme'];
@@ -62,7 +64,7 @@ class CubeHandler extends AbstractProcessingHandler
      * @throws \LogicException           when unable to connect to the socket
      * @throws MissingExtensionException when there is no socket extension
      */
-    protected function connectUdp()
+    protected function connectUdp(): void
     {
         if (!extension_loaded('sockets')) {
             throw new MissingExtensionException('The sockets extension is required to use udp URLs with the CubeHandler');
@@ -79,13 +81,15 @@ class CubeHandler extends AbstractProcessingHandler
     }
 
     /**
-     * Establish a connection to a http server
-     * @throws \LogicException when no curl extension
+     * Establish a connection to an http server
+     *
+     * @throws \LogicException           when unable to connect to the socket
+     * @throws MissingExtensionException when no curl extension
      */
-    protected function connectHttp()
+    protected function connectHttp(): void
     {
         if (!extension_loaded('curl')) {
-            throw new \LogicException('The curl extension is needed to use http URLs with the CubeHandler');
+            throw new MissingExtensionException('The curl extension is required to use http URLs with the CubeHandler');
         }
 
         $this->httpConnection = curl_init('http://'.$this->host.':'.$this->port.'/1.0/event/put');
@@ -101,11 +105,11 @@ class CubeHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         $date = $record['datetime'];
 
-        $data = array('time' => $date->format('Y-m-d\TH:i:s.uO'));
+        $data = ['time' => $date->format('Y-m-d\TH:i:s.uO')];
         unset($record['datetime']);
 
         if (isset($record['context']['type'])) {
@@ -119,13 +123,13 @@ class CubeHandler extends AbstractProcessingHandler
         $data['data']['level'] = $record['level'];
 
         if ($this->scheme === 'http') {
-            $this->writeHttp(json_encode($data));
+            $this->writeHttp(Utils::jsonEncode($data));
         } else {
-            $this->writeUdp(json_encode($data));
+            $this->writeUdp(Utils::jsonEncode($data));
         }
     }
 
-    private function writeUdp($data)
+    private function writeUdp(string $data): void
     {
         if (!$this->udpConnection) {
             $this->connectUdp();
@@ -134,17 +138,17 @@ class CubeHandler extends AbstractProcessingHandler
         socket_send($this->udpConnection, $data, strlen($data), 0);
     }
 
-    private function writeHttp($data)
+    private function writeHttp(string $data): void
     {
         if (!$this->httpConnection) {
             $this->connectHttp();
         }
 
         curl_setopt($this->httpConnection, CURLOPT_POSTFIELDS, '['.$data.']');
-        curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, array(
+        curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, [
             'Content-Type: application/json',
             'Content-Length: ' . strlen('['.$data.']'),
-        ));
+        ]);
 
         Curl\Util::execute($this->httpConnection, 5, false);
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php b/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php
index 48d30b3..b0aeac9 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,9 +11,14 @@
 
 namespace Monolog\Handler\Curl;
 
-class Util
+/**
+ * This class is marked as internal and it is not under the BC promise of the package.
+ *
+ * @internal
+ */
+final class Util
 {
-    private static $retriableErrorCodes = array(
+    private static $retriableErrorCodes = [
         CURLE_COULDNT_RESOLVE_HOST,
         CURLE_COULDNT_CONNECT,
         CURLE_HTTP_NOT_FOUND,
@@ -21,18 +26,21 @@ class Util
         CURLE_OPERATION_TIMEOUTED,
         CURLE_HTTP_POST_ERROR,
         CURLE_SSL_CONNECT_ERROR,
-    );
+    ];
 
     /**
      * Executes a CURL request with optional retries and exception on failure
      *
-     * @param  resource          $ch curl handler
-     * @throws \RuntimeException
+     * @param  resource    $ch             curl handler
+     * @param  int         $retries
+     * @param  bool        $closeAfterDone
+     * @return bool|string @see curl_exec
      */
-    public static function execute($ch, $retries = 5, $closeAfterDone = true)
+    public static function execute($ch, int $retries = 5, bool $closeAfterDone = true)
     {
         while ($retries--) {
-            if (curl_exec($ch) === false) {
+            $curlResponse = curl_exec($ch);
+            if ($curlResponse === false) {
                 $curlErrno = curl_errno($ch);
 
                 if (false === in_array($curlErrno, self::$retriableErrorCodes, true) || !$retries) {
@@ -42,7 +50,7 @@ class Util
                         curl_close($ch);
                     }
 
-                    throw new \RuntimeException(sprintf('Curl error (code %s): %s', $curlErrno, $curlError));
+                    throw new \RuntimeException(sprintf('Curl error (code %d): %s', $curlErrno, $curlError));
                 }
 
                 continue;
@@ -51,7 +59,10 @@ class Util
             if ($closeAfterDone) {
                 curl_close($ch);
             }
-            break;
+
+            return $curlResponse;
         }
+
+        return false;
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php
index 35b55cb..864c29a 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -58,11 +58,11 @@ class DeduplicationHandler extends BufferHandler
     /**
      * @param HandlerInterface $handler            Handler.
      * @param string           $deduplicationStore The file/path where the deduplication log should be kept
-     * @param int              $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes
+     * @param string|int       $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes
      * @param int              $time               The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through
      * @param bool             $bubble             Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct(HandlerInterface $handler, $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, $time = 60, $bubble = true)
+    public function __construct(HandlerInterface $handler, ?string $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, int $time = 60, bool $bubble = true)
     {
         parent::__construct($handler, 0, Logger::DEBUG, $bubble, false);
 
@@ -71,7 +71,7 @@ class DeduplicationHandler extends BufferHandler
         $this->time = $time;
     }
 
-    public function flush()
+    public function flush(): void
     {
         if ($this->bufferSize === 0) {
             return;
@@ -81,7 +81,6 @@ class DeduplicationHandler extends BufferHandler
 
         foreach ($this->buffer as $record) {
             if ($record['level'] >= $this->deduplicationLevel) {
-
                 $passthru = $passthru || !$this->isDuplicate($record);
                 if ($passthru) {
                     $this->appendRecord($record);
@@ -101,7 +100,7 @@ class DeduplicationHandler extends BufferHandler
         }
     }
 
-    private function isDuplicate(array $record)
+    private function isDuplicate(array $record): bool
     {
         if (!file_exists($this->deduplicationStore)) {
             return false;
@@ -131,21 +130,26 @@ class DeduplicationHandler extends BufferHandler
         return false;
     }
 
-    private function collectLogs()
+    private function collectLogs(): void
     {
         if (!file_exists($this->deduplicationStore)) {
-            return false;
+            return;
         }
 
         $handle = fopen($this->deduplicationStore, 'rw+');
+
+        if (!$handle) {
+            throw new \RuntimeException('Failed to open file for reading and writing: ' . $this->deduplicationStore);
+        }
+
         flock($handle, LOCK_EX);
-        $validLogs = array();
+        $validLogs = [];
 
         $timestampValidity = time() - $this->time;
 
         while (!feof($handle)) {
             $log = fgets($handle);
-            if (substr($log, 0, 10) >= $timestampValidity) {
+            if ($log && substr($log, 0, 10) >= $timestampValidity) {
                 $validLogs[] = $log;
             }
         }
@@ -162,7 +166,7 @@ class DeduplicationHandler extends BufferHandler
         $this->gc = false;
     }
 
-    private function appendRecord(array $record)
+    private function appendRecord(array $record): void
     {
         file_put_contents($this->deduplicationStore, $record['datetime']->getTimestamp() . ':' . $record['level_name'] . ':' . preg_replace('{[\r\n].*}', '', $record['message']) . "\n", FILE_APPEND);
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php
index b91ffec..b80490d 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -13,6 +13,7 @@ namespace Monolog\Handler;
 
 use Monolog\Logger;
 use Monolog\Formatter\NormalizerFormatter;
+use Monolog\Formatter\FormatterInterface;
 use Doctrine\CouchDB\CouchDBClient;
 
 /**
@@ -24,7 +25,7 @@ class DoctrineCouchDBHandler extends AbstractProcessingHandler
 {
     private $client;
 
-    public function __construct(CouchDBClient $client, $level = Logger::DEBUG, $bubble = true)
+    public function __construct(CouchDBClient $client, $level = Logger::DEBUG, bool $bubble = true)
     {
         $this->client = $client;
         parent::__construct($level, $bubble);
@@ -33,12 +34,12 @@ class DoctrineCouchDBHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         $this->client->postDocument($record['formatted']);
     }
 
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new NormalizerFormatter;
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php
index 237b71f..21d7431 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -13,6 +13,7 @@ namespace Monolog\Handler;
 
 use Aws\Sdk;
 use Aws\DynamoDb\DynamoDbClient;
+use Monolog\Formatter\FormatterInterface;
 use Aws\DynamoDb\Marshaler;
 use Monolog\Formatter\ScalarFormatter;
 use Monolog\Logger;
@@ -25,7 +26,7 @@ use Monolog\Logger;
  */
 class DynamoDbHandler extends AbstractProcessingHandler
 {
-    const DATE_FORMAT = 'Y-m-d\TH:i:s.uO';
+    public const DATE_FORMAT = 'Y-m-d\TH:i:s.uO';
 
     /**
      * @var DynamoDbClient
@@ -48,12 +49,9 @@ class DynamoDbHandler extends AbstractProcessingHandler
     protected $marshaler;
 
     /**
-     * @param DynamoDbClient $client
-     * @param string         $table
-     * @param int            $level
-     * @param bool           $bubble
+     * @param int|string $level
      */
-    public function __construct(DynamoDbClient $client, $table, $level = Logger::DEBUG, $bubble = true)
+    public function __construct(DynamoDbClient $client, string $table, $level = Logger::DEBUG, bool $bubble = true)
     {
         if (defined('Aws\Sdk::VERSION') && version_compare(Sdk::VERSION, '3.0', '>=')) {
             $this->version = 3;
@@ -71,7 +69,7 @@ class DynamoDbHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         $filtered = $this->filterEmptyFields($record['formatted']);
         if ($this->version === 3) {
@@ -80,17 +78,13 @@ class DynamoDbHandler extends AbstractProcessingHandler
             $formatted = $this->client->formatAttributes($filtered);
         }
 
-        $this->client->putItem(array(
+        $this->client->putItem([
             'TableName' => $this->table,
             'Item' => $formatted,
-        ));
+        ]);
     }
 
-    /**
-     * @param  array $record
-     * @return array
-     */
-    protected function filterEmptyFields(array $record)
+    protected function filterEmptyFields(array $record): array
     {
         return array_filter($record, function ($value) {
             return !empty($value) || false === $value || 0 === $value;
@@ -100,7 +94,7 @@ class DynamoDbHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new ScalarFormatter(self::DATE_FORMAT);
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php
index bb0f83e..6d0021b 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,29 +11,37 @@
 
 namespace Monolog\Handler;
 
+use Elasticsearch\Client;
+use Elasticsearch\Common\Exceptions\RuntimeException as ElasticsearchRuntimeException;
+use InvalidArgumentException;
+use Monolog\Formatter\ElasticsearchFormatter;
 use Monolog\Formatter\FormatterInterface;
-use Monolog\Formatter\ElasticaFormatter;
 use Monolog\Logger;
-use Elastica\Client;
-use Elastica\Exception\ExceptionInterface;
+use RuntimeException;
+use Throwable;
 
 /**
- * Elastic Search handler
+ * Elasticsearch handler
  *
- * Usage example:
+ * @link https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html
+ *
+ * Simple usage example:
+ *
+ *    $client = \Elasticsearch\ClientBuilder::create()
+ *        ->setHosts($hosts)
+ *        ->build();
  *
- *    $client = new \Elastica\Client();
  *    $options = array(
  *        'index' => 'elastic_index_name',
- *        'type' => 'elastic_doc_type',
+ *        'type'  => 'elastic_doc_type',
  *    );
- *    $handler = new ElasticSearchHandler($client, $options);
+ *    $handler = new ElasticsearchHandler($client, $options);
  *    $log = new Logger('application');
  *    $log->pushHandler($handler);
  *
- * @author Jelle Vink <jelle.vink@gmail.com>
+ * @author Avtandil Kikabidze <akalongman@gmail.com>
  */
-class ElasticSearchHandler extends AbstractProcessingHandler
+class ElasticsearchHandler extends AbstractProcessingHandler
 {
     /**
      * @var Client
@@ -43,24 +51,24 @@ class ElasticSearchHandler extends AbstractProcessingHandler
     /**
      * @var array Handler config options
      */
-    protected $options = array();
+    protected $options = [];
 
     /**
-     * @param Client $client  Elastica Client object
-     * @param array  $options Handler configuration
-     * @param int    $level   The minimum logging level at which this handler will be triggered
-     * @param bool   $bubble  Whether the messages that are handled can bubble up the stack or not
+     * @param Client     $client  Elasticsearch Client object
+     * @param array      $options Handler configuration
+     * @param string|int $level   The minimum logging level at which this handler will be triggered
+     * @param bool       $bubble  Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct(Client $client, array $options = array(), $level = Logger::DEBUG, $bubble = true)
+    public function __construct(Client $client, array $options = [], $level = Logger::DEBUG, bool $bubble = true)
     {
         parent::__construct($level, $bubble);
         $this->client = $client;
         $this->options = array_merge(
-            array(
-                'index'          => 'monolog',      // Elastic index name
-                'type'           => 'record',       // Elastic document type
-                'ignore_error'   => false,          // Suppress Elastica exceptions
-            ),
+            [
+                'index'        => 'monolog', // Elastic index name
+                'type'         => '_doc',    // Elastic document type
+                'ignore_error' => false,     // Suppress Elasticsearch exceptions
+            ],
             $options
         );
     }
@@ -68,27 +76,29 @@ class ElasticSearchHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
-        $this->bulkSend(array($record['formatted']));
+        $this->bulkSend([$record['formatted']]);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function setFormatter(FormatterInterface $formatter)
+    public function setFormatter(FormatterInterface $formatter): HandlerInterface
     {
-        if ($formatter instanceof ElasticaFormatter) {
+        if ($formatter instanceof ElasticsearchFormatter) {
             return parent::setFormatter($formatter);
         }
-        throw new \InvalidArgumentException('ElasticSearchHandler is only compatible with ElasticaFormatter');
+
+        throw new InvalidArgumentException('ElasticsearchHandler is only compatible with ElasticsearchFormatter');
     }
 
     /**
      * Getter options
+     *
      * @return array
      */
-    public function getOptions()
+    public function getOptions(): array
     {
         return $this->options;
     }
@@ -96,15 +106,15 @@ class ElasticSearchHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
-        return new ElasticaFormatter($this->options['index'], $this->options['type']);
+        return new ElasticsearchFormatter($this->options['index'], $this->options['type']);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function handleBatch(array $records)
+    public function handleBatch(array $records): void
     {
         $documents = $this->getFormatter()->formatBatch($records);
         $this->bulkSend($documents);
@@ -112,16 +122,37 @@ class ElasticSearchHandler extends AbstractProcessingHandler
 
     /**
      * Use Elasticsearch bulk API to send list of documents
-     * @param  array             $documents
+     *
+     * @param  array             $records
      * @throws \RuntimeException
      */
-    protected function bulkSend(array $documents)
+    protected function bulkSend(array $records): void
     {
         try {
-            $this->client->addDocuments($documents);
-        } catch (ExceptionInterface $e) {
-            if (!$this->options['ignore_error']) {
-                throw new \RuntimeException("Error sending messages to Elasticsearch", 0, $e);
+            $params = [
+                'body' => [],
+            ];
+
+            foreach ($records as $record) {
+                $params['body'][] = [
+                    'index' => [
+                        '_index' => $record['_index'],
+                        '_type'  => $record['_type'],
+                    ],
+                ];
+                unset($record['_index'], $record['_type']);
+
+                $params['body'][] = $record;
+            }
+
+            $responses = $this->client->bulk($params);
+
+            if ($responses['errors'] === true) {
+                throw new ElasticsearchRuntimeException('Elasticsearch returned error for one of the records');
+            }
+        } catch (Throwable $e) {
+            if (! $this->options['ignore_error']) {
+                throw new RuntimeException('Error sending messages to Elasticsearch', 0, $e);
             }
         }
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php
index b2986b0..737c070 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,6 +12,7 @@
 namespace Monolog\Handler;
 
 use Monolog\Formatter\LineFormatter;
+use Monolog\Formatter\FormatterInterface;
 use Monolog\Logger;
 
 /**
@@ -21,24 +22,25 @@ use Monolog\Logger;
  */
 class ErrorLogHandler extends AbstractProcessingHandler
 {
-    const OPERATING_SYSTEM = 0;
-    const SAPI = 4;
+    public const OPERATING_SYSTEM = 0;
+    public const SAPI = 4;
 
     protected $messageType;
     protected $expandNewlines;
 
     /**
-     * @param int  $messageType    Says where the error should go.
-     * @param int  $level          The minimum logging level at which this handler will be triggered
-     * @param bool $bubble         Whether the messages that are handled can bubble up the stack or not
-     * @param bool $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries
+     * @param int        $messageType    Says where the error should go.
+     * @param int|string $level          The minimum logging level at which this handler will be triggered
+     * @param bool       $bubble         Whether the messages that are handled can bubble up the stack or not
+     * @param bool       $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries
      */
-    public function __construct($messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, $bubble = true, $expandNewlines = false)
+    public function __construct(int $messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, bool $bubble = true, bool $expandNewlines = false)
     {
         parent::__construct($level, $bubble);
 
-        if (false === in_array($messageType, self::getAvailableTypes())) {
+        if (false === in_array($messageType, self::getAvailableTypes(), true)) {
             $message = sprintf('The given message type "%s" is not supported', print_r($messageType, true));
+
             throw new \InvalidArgumentException($message);
         }
 
@@ -49,18 +51,18 @@ class ErrorLogHandler extends AbstractProcessingHandler
     /**
      * @return array With all available types
      */
-    public static function getAvailableTypes()
+    public static function getAvailableTypes(): array
     {
-        return array(
+        return [
             self::OPERATING_SYSTEM,
             self::SAPI,
-        );
+        ];
     }
 
     /**
      * {@inheritDoc}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%');
     }
@@ -68,15 +70,17 @@ class ErrorLogHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
-        if ($this->expandNewlines) {
-            $lines = preg_split('{[\r\n]+}', (string) $record['formatted']);
-            foreach ($lines as $line) {
-                error_log($line, $this->messageType);
-            }
-        } else {
+        if (!$this->expandNewlines) {
             error_log((string) $record['formatted'], $this->messageType);
+
+            return;
+        }
+
+        $lines = preg_split('{[\r\n]+}', (string) $record['formatted']);
+        foreach ($lines as $line) {
+            error_log($line, $this->messageType);
         }
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php
index 938c1a7..f8d1007 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,6 +12,8 @@
 namespace Monolog\Handler;
 
 use Monolog\Logger;
+use Monolog\ResettableInterface;
+use Monolog\Formatter\FormatterInterface;
 
 /**
  * Simple handler wrapper that filters records based on a list of levels
@@ -21,8 +23,10 @@ use Monolog\Logger;
  * @author Hennadiy Verkh
  * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-class FilterHandler extends AbstractHandler
+class FilterHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface
 {
+    use ProcessableHandlerTrait;
+
     /**
      * Handler or factory callable($record, $this)
      *
@@ -45,12 +49,12 @@ class FilterHandler extends AbstractHandler
     protected $bubble;
 
     /**
-     * @param callable|HandlerInterface $handler        Handler or factory callable($record, $this).
+     * @param callable|HandlerInterface $handler        Handler or factory callable($record|null, $filterHandler).
      * @param int|array                 $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided
-     * @param int                       $maxLevel       Maximum level to accept, only used if $minLevelOrList is not an array
+     * @param int|string                $maxLevel       Maximum level to accept, only used if $minLevelOrList is not an array
      * @param bool                      $bubble         Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, $bubble = true)
+    public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, bool $bubble = true)
     {
         $this->handler  = $handler;
         $this->bubble   = $bubble;
@@ -61,10 +65,7 @@ class FilterHandler extends AbstractHandler
         }
     }
 
-    /**
-     * @return array
-     */
-    public function getAcceptedLevels()
+    public function getAcceptedLevels(): array
     {
         return array_flip($this->acceptedLevels);
     }
@@ -73,7 +74,7 @@ class FilterHandler extends AbstractHandler
      * @param int|string|array $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided
      * @param int|string       $maxLevel       Maximum level or level name to accept, only used if $minLevelOrList is not an array
      */
-    public function setAcceptedLevels($minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY)
+    public function setAcceptedLevels($minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY): self
     {
         if (is_array($minLevelOrList)) {
             $acceptedLevels = array_map('Monolog\Logger::toMonologLevel', $minLevelOrList);
@@ -85,12 +86,14 @@ class FilterHandler extends AbstractHandler
             }));
         }
         $this->acceptedLevels = array_flip($acceptedLevels);
+
+        return $this;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function isHandling(array $record)
+    public function isHandling(array $record): bool
     {
         return isset($this->acceptedLevels[$record['level']]);
     }
@@ -98,27 +101,17 @@ class FilterHandler extends AbstractHandler
     /**
      * {@inheritdoc}
      */
-    public function handle(array $record)
+    public function handle(array $record): bool
     {
         if (!$this->isHandling($record)) {
             return false;
         }
 
-        // The same logic as in FingersCrossedHandler
-        if (!$this->handler instanceof HandlerInterface) {
-            $this->handler = call_user_func($this->handler, $record, $this);
-            if (!$this->handler instanceof HandlerInterface) {
-                throw new \RuntimeException("The factory callable should return a HandlerInterface");
-            }
-        }
-
         if ($this->processors) {
-            foreach ($this->processors as $processor) {
-                $record = call_user_func($processor, $record);
-            }
+            $record = $this->processRecord($record);
         }
 
-        $this->handler->handle($record);
+        $this->getHandler($record)->handle($record);
 
         return false === $this->bubble;
     }
@@ -126,15 +119,57 @@ class FilterHandler extends AbstractHandler
     /**
      * {@inheritdoc}
      */
-    public function handleBatch(array $records)
+    public function handleBatch(array $records): void
     {
-        $filtered = array();
+        $filtered = [];
         foreach ($records as $record) {
             if ($this->isHandling($record)) {
                 $filtered[] = $record;
             }
         }
 
-        $this->handler->handleBatch($filtered);
+        $this->getHandler($filtered[count($filtered) - 1])->handleBatch($filtered);
+    }
+
+    /**
+     * Return the nested handler
+     *
+     * If the handler was provided as a factory callable, this will trigger the handler's instantiation.
+     *
+     * @return HandlerInterface
+     */
+    public function getHandler(array $record = null)
+    {
+        if (!$this->handler instanceof HandlerInterface) {
+            $this->handler = call_user_func($this->handler, $record, $this);
+            if (!$this->handler instanceof HandlerInterface) {
+                throw new \RuntimeException("The factory callable should return a HandlerInterface");
+            }
+        }
+
+        return $this->handler;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFormatter(FormatterInterface $formatter): HandlerInterface
+    {
+        $this->getHandler()->setFormatter($formatter);
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFormatter(): FormatterInterface
+    {
+        return $this->getHandler()->getFormatter();
+    }
+
+    public function reset()
+    {
+        $this->resetProcessors();
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php
index aaca12c..1ba99c7 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -20,9 +20,6 @@ interface ActivationStrategyInterface
 {
     /**
      * Returns whether the given record activates the handler.
-     *
-     * @param  array   $record
-     * @return bool
      */
-    public function isHandlerActivated(array $record);
+    public function isHandlerActivated(array $record): bool;
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php
index 2a2a64d..f98ecfa 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -35,20 +35,27 @@ use Monolog\Logger;
  */
 class ChannelLevelActivationStrategy implements ActivationStrategyInterface
 {
+    /**
+     * @var int
+     */
     private $defaultActionLevel;
+
+    /**
+     * @var array
+     */
     private $channelToActionLevel;
 
     /**
-     * @param int   $defaultActionLevel   The default action level to be used if the record's category doesn't match any
-     * @param array $channelToActionLevel An array that maps channel names to action levels.
+     * @param int|string $defaultActionLevel   The default action level to be used if the record's category doesn't match any
+     * @param array      $channelToActionLevel An array that maps channel names to action levels.
      */
-    public function __construct($defaultActionLevel, $channelToActionLevel = array())
+    public function __construct($defaultActionLevel, array $channelToActionLevel = [])
     {
         $this->defaultActionLevel = Logger::toMonologLevel($defaultActionLevel);
         $this->channelToActionLevel = array_map('Monolog\Logger::toMonologLevel', $channelToActionLevel);
     }
 
-    public function isHandlerActivated(array $record)
+    public function isHandlerActivated(array $record): bool
     {
         if (isset($this->channelToActionLevel[$record['channel']])) {
             return $record['level'] >= $this->channelToActionLevel[$record['channel']];
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php
index 6e63085..71601e4 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -20,14 +20,20 @@ use Monolog\Logger;
  */
 class ErrorLevelActivationStrategy implements ActivationStrategyInterface
 {
+    /**
+     * @var int
+     */
     private $actionLevel;
 
+    /**
+     * @param int|string $actionLevel Level or name or value
+     */
     public function __construct($actionLevel)
     {
         $this->actionLevel = Logger::toMonologLevel($actionLevel);
     }
 
-    public function isHandlerActivated(array $record)
+    public function isHandlerActivated(array $record): bool
     {
         return $record['level'] >= $this->actionLevel;
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php
index 275fd51..3e529f5 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -15,6 +15,7 @@ use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy;
 use Monolog\Handler\FingersCrossed\ActivationStrategyInterface;
 use Monolog\Logger;
 use Monolog\ResettableInterface;
+use Monolog\Formatter\FormatterInterface;
 
 /**
  * Buffers all records until a certain level is reached
@@ -23,30 +24,37 @@ use Monolog\ResettableInterface;
  * Only requests which actually trigger an error (or whatever your actionLevel is) will be
  * in the logs, but they will contain all records, not only those above the level threshold.
  *
+ * You can then have a passthruLevel as well which means that at the end of the request,
+ * even if it did not get activated, it will still send through log records of e.g. at least a
+ * warning level.
+ *
  * You can find the various activation strategies in the
  * Monolog\Handler\FingersCrossed\ namespace.
  *
  * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-class FingersCrossedHandler extends AbstractHandler
+class FingersCrossedHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface
 {
+    use ProcessableHandlerTrait;
+
     protected $handler;
     protected $activationStrategy;
     protected $buffering = true;
     protected $bufferSize;
-    protected $buffer = array();
+    protected $buffer = [];
     protected $stopBuffering;
     protected $passthruLevel;
+    protected $bubble;
 
     /**
-     * @param callable|HandlerInterface       $handler            Handler or factory callable($record, $fingersCrossedHandler).
-     * @param int|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action
-     * @param int                             $bufferSize         How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
-     * @param bool                            $bubble             Whether the messages that are handled can bubble up the stack or not
-     * @param bool                            $stopBuffering      Whether the handler should stop buffering after being triggered (default true)
-     * @param int                             $passthruLevel      Minimum level to always flush to handler on close, even if strategy not triggered
+     * @param callable|HandlerInterface              $handler            Handler or factory callable($record|null, $fingersCrossedHandler).
+     * @param int|string|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action, or a level name/value at which the handler is activated
+     * @param int                                    $bufferSize         How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
+     * @param bool                                   $bubble             Whether the messages that are handled can bubble up the stack or not
+     * @param bool                                   $stopBuffering      Whether the handler should stop buffering after being triggered (default true)
+     * @param int|string                             $passthruLevel      Minimum level to always flush to handler on close, even if strategy not triggered
      */
-    public function __construct($handler, $activationStrategy = null, $bufferSize = 0, $bubble = true, $stopBuffering = true, $passthruLevel = null)
+    public function __construct($handler, $activationStrategy = null, int $bufferSize = 0, bool $bubble = true, bool $stopBuffering = true, $passthruLevel = null)
     {
         if (null === $activationStrategy) {
             $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING);
@@ -75,7 +83,7 @@ class FingersCrossedHandler extends AbstractHandler
     /**
      * {@inheritdoc}
      */
-    public function isHandling(array $record)
+    public function isHandling(array $record): bool
     {
         return true;
     }
@@ -83,32 +91,23 @@ class FingersCrossedHandler extends AbstractHandler
     /**
      * Manually activate this logger regardless of the activation strategy
      */
-    public function activate()
+    public function activate(): void
     {
         if ($this->stopBuffering) {
             $this->buffering = false;
         }
-        if (!$this->handler instanceof HandlerInterface) {
-            $record = end($this->buffer) ?: null;
 
-            $this->handler = call_user_func($this->handler, $record, $this);
-            if (!$this->handler instanceof HandlerInterface) {
-                throw new \RuntimeException("The factory callable should return a HandlerInterface");
-            }
-        }
-        $this->handler->handleBatch($this->buffer);
-        $this->buffer = array();
+        $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer);
+        $this->buffer = [];
     }
 
     /**
      * {@inheritdoc}
      */
-    public function handle(array $record)
+    public function handle(array $record): bool
     {
         if ($this->processors) {
-            foreach ($this->processors as $processor) {
-                $record = call_user_func($processor, $record);
-            }
+            $record = $this->processRecord($record);
         }
 
         if ($this->buffering) {
@@ -120,7 +119,7 @@ class FingersCrossedHandler extends AbstractHandler
                 $this->activate();
             }
         } else {
-            $this->handler->handle($record);
+            $this->getHandler($record)->handle($record);
         }
 
         return false === $this->bubble;
@@ -129,19 +128,21 @@ class FingersCrossedHandler extends AbstractHandler
     /**
      * {@inheritdoc}
      */
-    public function close()
+    public function close(): void
     {
         $this->flushBuffer();
+
+        $this->handler->close();
     }
 
     public function reset()
     {
         $this->flushBuffer();
 
-        parent::reset();
+        $this->resetProcessors();
 
-        if ($this->handler instanceof ResettableInterface) {
-            $this->handler->reset();
+        if ($this->getHandler() instanceof ResettableInterface) {
+            $this->getHandler()->reset();
         }
     }
 
@@ -150,16 +151,16 @@ class FingersCrossedHandler extends AbstractHandler
      *
      * It also resets the handler to its initial buffering state.
      */
-    public function clear()
+    public function clear(): void
     {
-        $this->buffer = array();
+        $this->buffer = [];
         $this->reset();
     }
 
     /**
      * Resets the state of the handler. Stops forwarding records to the wrapped handler.
      */
-    private function flushBuffer()
+    private function flushBuffer(): void
     {
         if (null !== $this->passthruLevel) {
             $level = $this->passthruLevel;
@@ -167,11 +168,48 @@ class FingersCrossedHandler extends AbstractHandler
                 return $record['level'] >= $level;
             });
             if (count($this->buffer) > 0) {
-                $this->handler->handleBatch($this->buffer);
+                $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer);
             }
         }
 
-        $this->buffer = array();
+        $this->buffer = [];
         $this->buffering = true;
     }
+
+    /**
+     * Return the nested handler
+     *
+     * If the handler was provided as a factory callable, this will trigger the handler's instantiation.
+     *
+     * @return HandlerInterface
+     */
+    public function getHandler(array $record = null)
+    {
+        if (!$this->handler instanceof HandlerInterface) {
+            $this->handler = call_user_func($this->handler, $record, $this);
+            if (!$this->handler instanceof HandlerInterface) {
+                throw new \RuntimeException("The factory callable should return a HandlerInterface");
+            }
+        }
+
+        return $this->handler;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFormatter(FormatterInterface $formatter): HandlerInterface
+    {
+        $this->getHandler()->setFormatter($formatter);
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFormatter(): FormatterInterface
+    {
+        return $this->getHandler()->getFormatter();
+    }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php
index c30b184..c963863 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,6 +12,7 @@
 namespace Monolog\Handler;
 
 use Monolog\Formatter\WildfireFormatter;
+use Monolog\Formatter\FormatterInterface;
 
 /**
  * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol.
@@ -20,25 +21,27 @@ use Monolog\Formatter\WildfireFormatter;
  */
 class FirePHPHandler extends AbstractProcessingHandler
 {
+    use WebRequestRecognizerTrait;
+
     /**
      * WildFire JSON header message format
      */
-    const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2';
+    protected const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2';
 
     /**
      * FirePHP structure for parsing messages & their presentation
      */
-    const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1';
+    protected const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1';
 
     /**
      * Must reference a "known" plugin, otherwise headers won't display in FirePHP
      */
-    const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3';
+    protected const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3';
 
     /**
      * Header prefix for Wildfire to recognize & parse headers
      */
-    const HEADER_PREFIX = 'X-Wf';
+    protected const HEADER_PREFIX = 'X-Wf';
 
     /**
      * Whether or not Wildfire vendor-specific headers have been generated & sent yet
@@ -60,26 +63,24 @@ class FirePHPHandler extends AbstractProcessingHandler
      * @param  string $message Log message
      * @return array  Complete header string ready for the client as key and message as value
      */
-    protected function createHeader(array $meta, $message)
+    protected function createHeader(array $meta, string $message): array
     {
-        $header = sprintf('%s-%s', self::HEADER_PREFIX, join('-', $meta));
+        $header = sprintf('%s-%s', static::HEADER_PREFIX, join('-', $meta));
 
-        return array($header => $message);
+        return [$header => $message];
     }
 
     /**
      * Creates message header from record
      *
      * @see createHeader()
-     * @param  array  $record
-     * @return string
      */
-    protected function createRecordHeader(array $record)
+    protected function createRecordHeader(array $record): array
     {
         // Wildfire is extensible to support multiple protocols & plugins in a single request,
         // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake.
         return $this->createHeader(
-            array(1, 1, 1, self::$messageIndex++),
+            [1, 1, 1, self::$messageIndex++],
             $record['formatted']
         );
     }
@@ -87,7 +88,7 @@ class FirePHPHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new WildfireFormatter();
     }
@@ -97,25 +98,21 @@ class FirePHPHandler extends AbstractProcessingHandler
      *
      * @see createHeader()
      * @see sendHeader()
-     * @return array
      */
-    protected function getInitHeaders()
+    protected function getInitHeaders(): array
     {
         // Initial payload consists of required headers for Wildfire
         return array_merge(
-            $this->createHeader(array('Protocol', 1), self::PROTOCOL_URI),
-            $this->createHeader(array(1, 'Structure', 1), self::STRUCTURE_URI),
-            $this->createHeader(array(1, 'Plugin', 1), self::PLUGIN_URI)
+            $this->createHeader(['Protocol', 1], static::PROTOCOL_URI),
+            $this->createHeader([1, 'Structure', 1], static::STRUCTURE_URI),
+            $this->createHeader([1, 'Plugin', 1], static::PLUGIN_URI)
         );
     }
 
     /**
      * Send header string to the client
-     *
-     * @param string $header
-     * @param string $content
      */
-    protected function sendHeader($header, $content)
+    protected function sendHeader(string $header, string $content): void
     {
         if (!headers_sent() && self::$sendHeaders) {
             header(sprintf('%s: %s', $header, $content));
@@ -129,9 +126,9 @@ class FirePHPHandler extends AbstractProcessingHandler
      * @see sendInitHeaders()
      * @param array $record
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
-        if (!self::$sendHeaders) {
+        if (!self::$sendHeaders || !$this->isWebRequest()) {
             return;
         }
 
@@ -157,10 +154,8 @@ class FirePHPHandler extends AbstractProcessingHandler
 
     /**
      * Verifies if the headers are accepted by the current user agent
-     *
-     * @return bool
      */
-    protected function headersAccepted()
+    protected function headersAccepted(): bool
     {
         if (!empty($_SERVER['HTTP_USER_AGENT']) && preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT'])) {
             return true;
@@ -168,28 +163,4 @@ class FirePHPHandler extends AbstractProcessingHandler
 
         return isset($_SERVER['HTTP_X_FIREPHP_VERSION']);
     }
-
-    /**
-     * BC getter for the sendHeaders property that has been made static
-     */
-    public function __get($property)
-    {
-        if ('sendHeaders' !== $property) {
-            throw new \InvalidArgumentException('Undefined property '.$property);
-        }
-
-        return static::$sendHeaders;
-    }
-
-    /**
-     * BC setter for the sendHeaders property that has been made static
-     */
-    public function __set($property, $value)
-    {
-        if ('sendHeaders' !== $property) {
-            throw new \InvalidArgumentException('Undefined property '.$property);
-        }
-
-        static::$sendHeaders = $value;
-    }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php
index c43c013..5087009 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,6 +11,7 @@
 
 namespace Monolog\Handler;
 
+use Monolog\Formatter\FormatterInterface;
 use Monolog\Formatter\LineFormatter;
 use Monolog\Logger;
 
@@ -24,9 +25,9 @@ use Monolog\Logger;
  */
 class FleepHookHandler extends SocketHandler
 {
-    const FLEEP_HOST = 'fleep.io';
+    protected const FLEEP_HOST = 'fleep.io';
 
-    const FLEEP_HOOK_URI = '/hook/';
+    protected const FLEEP_HOOK_URI = '/hook/';
 
     /**
      * @var string Webhook token (specifies the conversation where logs are sent)
@@ -40,11 +41,11 @@ class FleepHookHandler extends SocketHandler
      * see https://fleep.io/integrations/webhooks/
      *
      * @param  string                    $token  Webhook token
-     * @param  bool|int                  $level  The minimum logging level at which this handler will be triggered
+     * @param  string|int                $level  The minimum logging level at which this handler will be triggered
      * @param  bool                      $bubble Whether the messages that are handled can bubble up the stack or not
      * @throws MissingExtensionException
      */
-    public function __construct($token, $level = Logger::DEBUG, $bubble = true)
+    public function __construct(string $token, $level = Logger::DEBUG, bool $bubble = true)
     {
         if (!extension_loaded('openssl')) {
             throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FleepHookHandler');
@@ -52,7 +53,7 @@ class FleepHookHandler extends SocketHandler
 
         $this->token = $token;
 
-        $connectionString = 'ssl://' . self::FLEEP_HOST . ':443';
+        $connectionString = 'ssl://' . static::FLEEP_HOST . ':443';
         parent::__construct($connectionString, $level, $bubble);
     }
 
@@ -63,17 +64,15 @@ class FleepHookHandler extends SocketHandler
      *
      * @return LineFormatter
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new LineFormatter(null, null, true, true);
     }
 
     /**
      * Handles a log record
-     *
-     * @param array $record
      */
-    public function write(array $record)
+    public function write(array $record): void
     {
         parent::write($record);
         $this->closeSocket();
@@ -81,11 +80,8 @@ class FleepHookHandler extends SocketHandler
 
     /**
      * {@inheritdoc}
-     *
-     * @param  array  $record
-     * @return string
      */
-    protected function generateDataStream($record)
+    protected function generateDataStream(array $record): string
     {
         $content = $this->buildContent($record);
 
@@ -94,14 +90,11 @@ class FleepHookHandler extends SocketHandler
 
     /**
      * Builds the header of the API Call
-     *
-     * @param  string $content
-     * @return string
      */
-    private function buildHeader($content)
+    private function buildHeader(string $content): string
     {
-        $header = "POST " . self::FLEEP_HOOK_URI . $this->token . " HTTP/1.1\r\n";
-        $header .= "Host: " . self::FLEEP_HOST . "\r\n";
+        $header = "POST " . static::FLEEP_HOOK_URI . $this->token . " HTTP/1.1\r\n";
+        $header .= "Host: " . static::FLEEP_HOST . "\r\n";
         $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
         $header .= "Content-Length: " . strlen($content) . "\r\n";
         $header .= "\r\n";
@@ -111,15 +104,12 @@ class FleepHookHandler extends SocketHandler
 
     /**
      * Builds the body of API call
-     *
-     * @param  array  $record
-     * @return string
      */
-    private function buildContent($record)
+    private function buildContent(array $record): string
     {
-        $dataArray = array(
+        $dataArray = [
             'message' => $record['formatted'],
-        );
+        ];
 
         return http_build_query($dataArray);
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php
index dd9a361..062af41 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,6 +12,7 @@
 namespace Monolog\Handler;
 
 use Monolog\Logger;
+use Monolog\Utils;
 use Monolog\Formatter\FlowdockFormatter;
 use Monolog\Formatter\FormatterInterface;
 
@@ -34,13 +35,12 @@ class FlowdockHandler extends SocketHandler
     protected $apiToken;
 
     /**
-     * @param string   $apiToken
-     * @param bool|int $level    The minimum logging level at which this handler will be triggered
-     * @param bool     $bubble   Whether the messages that are handled can bubble up the stack or not
+     * @param string|int $level  The minimum logging level at which this handler will be triggered
+     * @param bool       $bubble Whether the messages that are handled can bubble up the stack or not
      *
      * @throws MissingExtensionException if OpenSSL is missing
      */
-    public function __construct($apiToken, $level = Logger::DEBUG, $bubble = true)
+    public function __construct(string $apiToken, $level = Logger::DEBUG, bool $bubble = true)
     {
         if (!extension_loaded('openssl')) {
             throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FlowdockHandler');
@@ -53,7 +53,7 @@ class FlowdockHandler extends SocketHandler
     /**
      * {@inheritdoc}
      */
-    public function setFormatter(FormatterInterface $formatter)
+    public function setFormatter(FormatterInterface $formatter): HandlerInterface
     {
         if (!$formatter instanceof FlowdockFormatter) {
             throw new \InvalidArgumentException('The FlowdockHandler requires an instance of Monolog\Formatter\FlowdockFormatter to function correctly');
@@ -64,10 +64,8 @@ class FlowdockHandler extends SocketHandler
 
     /**
      * Gets the default formatter.
-     *
-     * @return FormatterInterface
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         throw new \InvalidArgumentException('The FlowdockHandler must be configured (via setFormatter) with an instance of Monolog\Formatter\FlowdockFormatter to function correctly');
     }
@@ -77,7 +75,7 @@ class FlowdockHandler extends SocketHandler
      *
      * @param array $record
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         parent::write($record);
 
@@ -86,11 +84,8 @@ class FlowdockHandler extends SocketHandler
 
     /**
      * {@inheritdoc}
-     *
-     * @param  array  $record
-     * @return string
      */
-    protected function generateDataStream($record)
+    protected function generateDataStream(array $record): string
     {
         $content = $this->buildContent($record);
 
@@ -99,22 +94,16 @@ class FlowdockHandler extends SocketHandler
 
     /**
      * Builds the body of API call
-     *
-     * @param  array  $record
-     * @return string
      */
-    private function buildContent($record)
+    private function buildContent(array $record): string
     {
-        return json_encode($record['formatted']['flowdock']);
+        return Utils::jsonEncode($record['formatted']['flowdock']);
     }
 
     /**
      * Builds the header of the API Call
-     *
-     * @param  string $content
-     * @return string
      */
-    private function buildHeader($content)
+    private function buildHeader(string $content): string
     {
         $header = "POST /v1/messages/team_inbox/" . $this->apiToken . " HTTP/1.1\r\n";
         $header .= "Host: api.flowdock.com\r\n";
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php
index 71e4669..d6965fa 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,12 +11,10 @@
 
 namespace Monolog\Handler;
 
-use Gelf\IMessagePublisher;
 use Gelf\PublisherInterface;
-use Gelf\Publisher;
-use InvalidArgumentException;
 use Monolog\Logger;
 use Monolog\Formatter\GelfMessageFormatter;
+use Monolog\Formatter\FormatterInterface;
 
 /**
  * Handler to send messages to a Graylog2 (http://www.graylog2.org) server
@@ -27,30 +25,26 @@ use Monolog\Formatter\GelfMessageFormatter;
 class GelfHandler extends AbstractProcessingHandler
 {
     /**
-     * @var Publisher the publisher object that sends the message to the server
+     * @var PublisherInterface|null the publisher object that sends the message to the server
      */
     protected $publisher;
 
     /**
-     * @param PublisherInterface|IMessagePublisher|Publisher $publisher a publisher object
-     * @param int                                            $level     The minimum logging level at which this handler will be triggered
-     * @param bool                                           $bubble    Whether the messages that are handled can bubble up the stack or not
+     * @param PublisherInterface $publisher a publisher object
+     * @param string|int         $level     The minimum logging level at which this handler will be triggered
+     * @param bool               $bubble    Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct($publisher, $level = Logger::DEBUG, $bubble = true)
+    public function __construct(PublisherInterface $publisher, $level = Logger::DEBUG, bool $bubble = true)
     {
         parent::__construct($level, $bubble);
 
-        if (!$publisher instanceof Publisher && !$publisher instanceof IMessagePublisher && !$publisher instanceof PublisherInterface) {
-            throw new InvalidArgumentException('Invalid publisher, expected a Gelf\Publisher, Gelf\IMessagePublisher or Gelf\PublisherInterface instance');
-        }
-
         $this->publisher = $publisher;
     }
 
     /**
      * {@inheritdoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         $this->publisher->publish($record['formatted']);
     }
@@ -58,7 +52,7 @@ class GelfHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new GelfMessageFormatter();
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php
index 28e5c56..5121856 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -19,15 +19,18 @@ use Monolog\ResettableInterface;
  *
  * @author Lenar Lõhmus <lenar@city.ee>
  */
-class GroupHandler extends AbstractHandler
+class GroupHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface
 {
+    use ProcessableHandlerTrait;
+
     protected $handlers;
+    protected $bubble;
 
     /**
-     * @param array $handlers Array of Handlers.
-     * @param bool  $bubble   Whether the messages that are handled can bubble up the stack or not
+     * @param HandlerInterface[] $handlers Array of Handlers.
+     * @param bool               $bubble   Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct(array $handlers, $bubble = true)
+    public function __construct(array $handlers, bool $bubble = true)
     {
         foreach ($handlers as $handler) {
             if (!$handler instanceof HandlerInterface) {
@@ -42,7 +45,7 @@ class GroupHandler extends AbstractHandler
     /**
      * {@inheritdoc}
      */
-    public function isHandling(array $record)
+    public function isHandling(array $record): bool
     {
         foreach ($this->handlers as $handler) {
             if ($handler->isHandling($record)) {
@@ -56,12 +59,10 @@ class GroupHandler extends AbstractHandler
     /**
      * {@inheritdoc}
      */
-    public function handle(array $record)
+    public function handle(array $record): bool
     {
         if ($this->processors) {
-            foreach ($this->processors as $processor) {
-                $record = call_user_func($processor, $record);
-            }
+            $record = $this->processRecord($record);
         }
 
         foreach ($this->handlers as $handler) {
@@ -74,14 +75,12 @@ class GroupHandler extends AbstractHandler
     /**
      * {@inheritdoc}
      */
-    public function handleBatch(array $records)
+    public function handleBatch(array $records): void
     {
         if ($this->processors) {
-            $processed = array();
+            $processed = [];
             foreach ($records as $record) {
-                foreach ($this->processors as $processor) {
-                    $processed[] = call_user_func($processor, $record);
-                }
+                $processed[] = $this->processRecord($record);
             }
             $records = $processed;
         }
@@ -93,7 +92,7 @@ class GroupHandler extends AbstractHandler
 
     public function reset()
     {
-        parent::reset();
+        $this->resetProcessors();
 
         foreach ($this->handlers as $handler) {
             if ($handler instanceof ResettableInterface) {
@@ -102,10 +101,19 @@ class GroupHandler extends AbstractHandler
         }
     }
 
+    public function close(): void
+    {
+        parent::close();
+
+        foreach ($this->handlers as $handler) {
+            $handler->close();
+        }
+    }
+
     /**
      * {@inheritdoc}
      */
-    public function setFormatter(FormatterInterface $formatter)
+    public function setFormatter(FormatterInterface $formatter): HandlerInterface
     {
         foreach ($this->handlers as $handler) {
             $handler->setFormatter($formatter);
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php
index 8d5a4a0..68aed18 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,8 +11,6 @@
 
 namespace Monolog\Handler;
 
-use Monolog\Formatter\FormatterInterface;
-
 /**
  * Interface that all Monolog Handlers must implement
  *
@@ -33,7 +31,7 @@ interface HandlerInterface
      *
      * @return bool
      */
-    public function isHandling(array $record);
+    public function isHandling(array $record): bool;
 
     /**
      * Handles a record.
@@ -45,46 +43,34 @@ interface HandlerInterface
      * Unless the bubbling is interrupted (by returning true), the Logger class will keep on
      * calling further handlers in the stack with a given log record.
      *
-     * @param  array   $record The record to handle
-     * @return bool true means that this handler handled the record, and that bubbling is not permitted.
-     *                        false means the record was either not processed or that this handler allows bubbling.
+     * @param  array $record The record to handle
+     * @return bool  true means that this handler handled the record, and that bubbling is not permitted.
+     *                      false means the record was either not processed or that this handler allows bubbling.
      */
-    public function handle(array $record);
+    public function handle(array $record): bool;
 
     /**
      * Handles a set of records at once.
      *
      * @param array $records The records to handle (an array of record arrays)
      */
-    public function handleBatch(array $records);
+    public function handleBatch(array $records): void;
 
     /**
-     * Adds a processor in the stack.
+     * Closes the handler.
      *
-     * @param  callable $callback
-     * @return self
-     */
-    public function pushProcessor($callback);
-
-    /**
-     * Removes the processor on top of the stack and returns it.
+     * Ends a log cycle and frees all resources used by the handler.
      *
-     * @return callable
-     */
-    public function popProcessor();
-
-    /**
-     * Sets the formatter.
+     * Closing a Handler means flushing all buffers and freeing any open resources/handles.
      *
-     * @param  FormatterInterface $formatter
-     * @return self
-     */
-    public function setFormatter(FormatterInterface $formatter);
-
-    /**
-     * Gets the formatter.
+     * Implementations have to be idempotent (i.e. it should be possible to call close several times without breakage)
+     * and ideally handlers should be able to reopen themselves on handle() after they have been closed.
+     *
+     * This is useful at the end of a request and will be called automatically when the object
+     * is destroyed if you extend Monolog\Handler\Handler.
      *
-     * @return FormatterInterface
+     * If you are thinking of calling this method yourself, most likely you should be
+     * calling ResettableInterface::reset instead. Have a look.
      */
-    public function getFormatter();
+    public function close(): void;
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php b/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php
index 55e6498..3f2c7a1 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -31,17 +31,13 @@ use Monolog\Formatter\FormatterInterface;
  *
  * @author Alexey Karapetov <alexey@karapetov.com>
  */
-class HandlerWrapper implements HandlerInterface, ResettableInterface
+class HandlerWrapper implements HandlerInterface, ProcessableHandlerInterface, FormattableHandlerInterface, ResettableInterface
 {
     /**
      * @var HandlerInterface
      */
     protected $handler;
 
-    /**
-     * HandlerWrapper constructor.
-     * @param HandlerInterface $handler
-     */
     public function __construct(HandlerInterface $handler)
     {
         $this->handler = $handler;
@@ -50,7 +46,7 @@ class HandlerWrapper implements HandlerInterface, ResettableInterface
     /**
      * {@inheritdoc}
      */
-    public function isHandling(array $record)
+    public function isHandling(array $record): bool
     {
         return $this->handler->isHandling($record);
     }
@@ -58,7 +54,7 @@ class HandlerWrapper implements HandlerInterface, ResettableInterface
     /**
      * {@inheritdoc}
      */
-    public function handle(array $record)
+    public function handle(array $record): bool
     {
         return $this->handler->handle($record);
     }
@@ -66,45 +62,67 @@ class HandlerWrapper implements HandlerInterface, ResettableInterface
     /**
      * {@inheritdoc}
      */
-    public function handleBatch(array $records)
+    public function handleBatch(array $records): void
+    {
+        $this->handler->handleBatch($records);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close(): void
     {
-        return $this->handler->handleBatch($records);
+        $this->handler->close();
     }
 
     /**
      * {@inheritdoc}
      */
-    public function pushProcessor($callback)
+    public function pushProcessor(callable $callback): HandlerInterface
     {
-        $this->handler->pushProcessor($callback);
+        if ($this->handler instanceof ProcessableHandlerInterface) {
+            $this->handler->pushProcessor($callback);
 
-        return $this;
+            return $this;
+        }
+
+        throw new \LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function popProcessor()
+    public function popProcessor(): callable
     {
-        return $this->handler->popProcessor();
+        if ($this->handler instanceof ProcessableHandlerInterface) {
+            return $this->handler->popProcessor();
+        }
+
+        throw new \LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function setFormatter(FormatterInterface $formatter)
+    public function setFormatter(FormatterInterface $formatter): HandlerInterface
     {
-        $this->handler->setFormatter($formatter);
+        if ($this->handler instanceof FormattableHandlerInterface) {
+            $this->handler->setFormatter($formatter);
+        }
 
-        return $this;
+        throw new \LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getFormatter()
+    public function getFormatter(): FormatterInterface
     {
-        return $this->handler->getFormatter();
+        if ($this->handler instanceof FormattableHandlerInterface) {
+            return $this->handler->getFormatter();
+        }
+
+        throw new \LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class);
     }
 
     public function reset()
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php
deleted file mode 100644
index 73233c9..0000000
--- a/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php
+++ /dev/null
@@ -1,365 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\Logger;
-
-/**
- * Sends notifications through the hipchat api to a hipchat room
- *
- * Notes:
- * API token - HipChat API token
- * Room      - HipChat Room Id or name, where messages are sent
- * Name      - Name used to send the message (from)
- * notify    - Should the message trigger a notification in the clients
- * version   - The API version to use (HipChatHandler::API_V1 | HipChatHandler::API_V2)
- *
- * @author Rafael Dohms <rafael@doh.ms>
- * @see    https://www.hipchat.com/docs/api
- */
-class HipChatHandler extends SocketHandler
-{
-    /**
-     * Use API version 1
-     */
-    const API_V1 = 'v1';
-
-    /**
-     * Use API version v2
-     */
-    const API_V2 = 'v2';
-
-    /**
-     * The maximum allowed length for the name used in the "from" field.
-     */
-    const MAXIMUM_NAME_LENGTH = 15;
-
-    /**
-     * The maximum allowed length for the message.
-     */
-    const MAXIMUM_MESSAGE_LENGTH = 9500;
-
-    /**
-     * @var string
-     */
-    private $token;
-
-    /**
-     * @var string
-     */
-    private $room;
-
-    /**
-     * @var string
-     */
-    private $name;
-
-    /**
-     * @var bool
-     */
-    private $notify;
-
-    /**
-     * @var string
-     */
-    private $format;
-
-    /**
-     * @var string
-     */
-    private $host;
-
-    /**
-     * @var string
-     */
-    private $version;
-
-    /**
-     * @param string $token   HipChat API Token
-     * @param string $room    The room that should be alerted of the message (Id or Name)
-     * @param string $name    Name used in the "from" field.
-     * @param bool   $notify  Trigger a notification in clients or not
-     * @param int    $level   The minimum logging level at which this handler will be triggered
-     * @param bool   $bubble  Whether the messages that are handled can bubble up the stack or not
-     * @param bool   $useSSL  Whether to connect via SSL.
-     * @param string $format  The format of the messages (default to text, can be set to html if you have html in the messages)
-     * @param string $host    The HipChat server hostname.
-     * @param string $version The HipChat API version (default HipChatHandler::API_V1)
-     */
-    public function __construct($token, $room, $name = 'Monolog', $notify = false, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $format = 'text', $host = 'api.hipchat.com', $version = self::API_V1)
-    {
-        if ($version == self::API_V1 && !$this->validateStringLength($name, static::MAXIMUM_NAME_LENGTH)) {
-            throw new \InvalidArgumentException('The supplied name is too long. HipChat\'s v1 API supports names up to 15 UTF-8 characters.');
-        }
-
-        $connectionString = $useSSL ? 'ssl://'.$host.':443' : $host.':80';
-        parent::__construct($connectionString, $level, $bubble);
-
-        $this->token = $token;
-        $this->name = $name;
-        $this->notify = $notify;
-        $this->room = $room;
-        $this->format = $format;
-        $this->host = $host;
-        $this->version = $version;
-    }
-
-    /**
-     * {@inheritdoc}
-     *
-     * @param  array  $record
-     * @return string
-     */
-    protected function generateDataStream($record)
-    {
-        $content = $this->buildContent($record);
-
-        return $this->buildHeader($content) . $content;
-    }
-
-    /**
-     * Builds the body of API call
-     *
-     * @param  array  $record
-     * @return string
-     */
-    private function buildContent($record)
-    {
-        $dataArray = array(
-            'notify' => $this->version == self::API_V1 ?
-                ($this->notify ? 1 : 0) :
-                ($this->notify ? 'true' : 'false'),
-            'message' => $record['formatted'],
-            'message_format' => $this->format,
-            'color' => $this->getAlertColor($record['level']),
-        );
-
-        if (!$this->validateStringLength($dataArray['message'], static::MAXIMUM_MESSAGE_LENGTH)) {
-            if (function_exists('mb_substr')) {
-                $dataArray['message'] = mb_substr($dataArray['message'], 0, static::MAXIMUM_MESSAGE_LENGTH).' [truncated]';
-            } else {
-                $dataArray['message'] = substr($dataArray['message'], 0, static::MAXIMUM_MESSAGE_LENGTH).' [truncated]';
-            }
-        }
-
-        // if we are using the legacy API then we need to send some additional information
-        if ($this->version == self::API_V1) {
-            $dataArray['room_id'] = $this->room;
-        }
-
-        // append the sender name if it is set
-        // always append it if we use the v1 api (it is required in v1)
-        if ($this->version == self::API_V1 || $this->name !== null) {
-            $dataArray['from'] = (string) $this->name;
-        }
-
-        return http_build_query($dataArray);
-    }
-
-    /**
-     * Builds the header of the API Call
-     *
-     * @param  string $content
-     * @return string
-     */
-    private function buildHeader($content)
-    {
-        if ($this->version == self::API_V1) {
-            $header = "POST /v1/rooms/message?format=json&auth_token={$this->token} HTTP/1.1\r\n";
-        } else {
-            // needed for rooms with special (spaces, etc) characters in the name
-            $room = rawurlencode($this->room);
-            $header = "POST /v2/room/{$room}/notification?auth_token={$this->token} HTTP/1.1\r\n";
-        }
-
-        $header .= "Host: {$this->host}\r\n";
-        $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
-        $header .= "Content-Length: " . strlen($content) . "\r\n";
-        $header .= "\r\n";
-
-        return $header;
-    }
-
-    /**
-     * Assigns a color to each level of log records.
-     *
-     * @param  int    $level
-     * @return string
-     */
-    protected function getAlertColor($level)
-    {
-        switch (true) {
-            case $level >= Logger::ERROR:
-                return 'red';
-            case $level >= Logger::WARNING:
-                return 'yellow';
-            case $level >= Logger::INFO:
-                return 'green';
-            case $level == Logger::DEBUG:
-                return 'gray';
-            default:
-                return 'yellow';
-        }
-    }
-
-    /**
-     * {@inheritdoc}
-     *
-     * @param array $record
-     */
-    protected function write(array $record)
-    {
-        parent::write($record);
-        $this->finalizeWrite();
-    }
-
-    /**
-     * Finalizes the request by reading some bytes and then closing the socket
-     *
-     * If we do not read some but close the socket too early, hipchat sometimes
-     * drops the request entirely.
-     */
-    protected function finalizeWrite()
-    {
-        $res = $this->getResource();
-        if (is_resource($res)) {
-            @fread($res, 2048);
-        }
-        $this->closeSocket();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function handleBatch(array $records)
-    {
-        if (count($records) == 0) {
-            return true;
-        }
-
-        $batchRecords = $this->combineRecords($records);
-
-        $handled = false;
-        foreach ($batchRecords as $batchRecord) {
-            if ($this->isHandling($batchRecord)) {
-                $this->write($batchRecord);
-                $handled = true;
-            }
-        }
-
-        if (!$handled) {
-            return false;
-        }
-
-        return false === $this->bubble;
-    }
-
-    /**
-     * Combines multiple records into one. Error level of the combined record
-     * will be the highest level from the given records. Datetime will be taken
-     * from the first record.
-     *
-     * @param $records
-     * @return array
-     */
-    private function combineRecords($records)
-    {
-        $batchRecord = null;
-        $batchRecords = array();
-        $messages = array();
-        $formattedMessages = array();
-        $level = 0;
-        $levelName = null;
-        $datetime = null;
-
-        foreach ($records as $record) {
-            $record = $this->processRecord($record);
-
-            if ($record['level'] > $level) {
-                $level = $record['level'];
-                $levelName = $record['level_name'];
-            }
-
-            if (null === $datetime) {
-                $datetime = $record['datetime'];
-            }
-
-            $messages[] = $record['message'];
-            $messageStr = implode(PHP_EOL, $messages);
-            $formattedMessages[] = $this->getFormatter()->format($record);
-            $formattedMessageStr = implode('', $formattedMessages);
-
-            $batchRecord = array(
-                'message'   => $messageStr,
-                'formatted' => $formattedMessageStr,
-                'context'   => array(),
-                'extra'     => array(),
-            );
-
-            if (!$this->validateStringLength($batchRecord['formatted'], static::MAXIMUM_MESSAGE_LENGTH)) {
-                // Pop the last message and implode the remaining messages
-                $lastMessage = array_pop($messages);
-                $lastFormattedMessage = array_pop($formattedMessages);
-                $batchRecord['message'] = implode(PHP_EOL, $messages);
-                $batchRecord['formatted'] = implode('', $formattedMessages);
-
-                $batchRecords[] = $batchRecord;
-                $messages = array($lastMessage);
-                $formattedMessages = array($lastFormattedMessage);
-
-                $batchRecord = null;
-            }
-        }
-
-        if (null !== $batchRecord) {
-            $batchRecords[] = $batchRecord;
-        }
-
-        // Set the max level and datetime for all records
-        foreach ($batchRecords as &$batchRecord) {
-            $batchRecord = array_merge(
-                $batchRecord,
-                array(
-                    'level'      => $level,
-                    'level_name' => $levelName,
-                    'datetime'   => $datetime,
-                )
-            );
-        }
-
-        return $batchRecords;
-    }
-
-    /**
-     * Validates the length of a string.
-     *
-     * If the `mb_strlen()` function is available, it will use that, as HipChat
-     * allows UTF-8 characters. Otherwise, it will fall back to `strlen()`.
-     *
-     * Note that this might cause false failures in the specific case of using
-     * a valid name with less than 16 characters, but 16 or more bytes, on a
-     * system where `mb_strlen()` is unavailable.
-     *
-     * @param string $str
-     * @param int    $length
-     *
-     * @return bool
-     */
-    private function validateStringLength($str, $length)
-    {
-        if (function_exists('mb_strlen')) {
-            return (mb_strlen($str) <= $length);
-        }
-
-        return (strlen($str) <= $length);
-    }
-}
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php
index 7f22622..921c9f2 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,6 +12,7 @@
 namespace Monolog\Handler;
 
 use Monolog\Logger;
+use Monolog\Utils;
 
 /**
  * IFTTTHandler uses cURL to trigger IFTTT Maker actions
@@ -30,12 +31,12 @@ class IFTTTHandler extends AbstractProcessingHandler
     private $secretKey;
 
     /**
-     * @param string $eventName The name of the IFTTT Maker event that should be triggered
-     * @param string $secretKey A valid IFTTT secret key
-     * @param int    $level     The minimum logging level at which this handler will be triggered
-     * @param bool   $bubble    Whether the messages that are handled can bubble up the stack or not
+     * @param string     $eventName The name of the IFTTT Maker event that should be triggered
+     * @param string     $secretKey A valid IFTTT secret key
+     * @param string|int $level     The minimum logging level at which this handler will be triggered
+     * @param bool       $bubble    Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct($eventName, $secretKey, $level = Logger::ERROR, $bubble = true)
+    public function __construct(string $eventName, string $secretKey, $level = Logger::ERROR, bool $bubble = true)
     {
         $this->eventName = $eventName;
         $this->secretKey = $secretKey;
@@ -46,23 +47,23 @@ class IFTTTHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    public function write(array $record)
+    public function write(array $record): void
     {
-        $postData = array(
+        $postData = [
             "value1" => $record["channel"],
             "value2" => $record["level_name"],
             "value3" => $record["message"],
-        );
-        $postString = json_encode($postData);
+        ];
+        $postString = Utils::jsonEncode($postData);
 
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_URL, "https://maker.ifttt.com/trigger/" . $this->eventName . "/with/key/" . $this->secretKey);
         curl_setopt($ch, CURLOPT_POST, true);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
         curl_setopt($ch, CURLOPT_POSTFIELDS, $postString);
-        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
+        curl_setopt($ch, CURLOPT_HTTPHEADER, [
             "Content-Type: application/json",
-        ));
+        ]);
 
         Curl\Util::execute($ch);
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php
index a12e3de..5ddc66b 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -9,9 +9,9 @@
  * file that was distributed with this source code.
  */
 
- namespace Monolog\Handler;
- 
- use Monolog\Logger;
+namespace Monolog\Handler;
+
+use Monolog\Logger;
 
 /**
  * Inspired on LogEntriesHandler.
@@ -27,18 +27,18 @@ class InsightOpsHandler extends SocketHandler
     protected $logToken;
 
     /**
-     * @param string $token  Log token supplied by InsightOps
-     * @param string $region Region where InsightOps account is hosted. Could be 'us' or 'eu'.
-     * @param bool   $useSSL Whether or not SSL encryption should be used
-     * @param int    $level  The minimum logging level to trigger this handler
-     * @param bool   $bubble Whether or not messages that are handled should bubble up the stack.
+     * @param string     $token  Log token supplied by InsightOps
+     * @param string     $region Region where InsightOps account is hosted. Could be 'us' or 'eu'.
+     * @param bool       $useSSL Whether or not SSL encryption should be used
+     * @param string|int $level  The minimum logging level to trigger this handler
+     * @param bool       $bubble Whether or not messages that are handled should bubble up the stack.
      *
      * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing
      */
-    public function __construct($token, $region = 'us', $useSSL = true, $level = Logger::DEBUG, $bubble = true)
+    public function __construct(string $token, string $region = 'us', bool $useSSL = true, $level = Logger::DEBUG, bool $bubble = true)
     {
         if ($useSSL && !extension_loaded('openssl')) {
-            throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler');
+            throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for InsightOpsHandler');
         }
 
         $endpoint = $useSSL
@@ -51,11 +51,8 @@ class InsightOpsHandler extends SocketHandler
 
     /**
      * {@inheritdoc}
-     *
-     * @param  array  $record
-     * @return string
      */
-    protected function generateDataStream($record)
+    protected function generateDataStream(array $record): string
     {
         return $this->logToken . ' ' . $record['formatted'];
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php
index ea89fb3..66de5f8 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -24,14 +24,15 @@ class LogEntriesHandler extends SocketHandler
     protected $logToken;
 
     /**
-     * @param string $token  Log token supplied by LogEntries
-     * @param bool   $useSSL Whether or not SSL encryption should be used.
-     * @param int    $level  The minimum logging level to trigger this handler
-     * @param bool   $bubble Whether or not messages that are handled should bubble up the stack.
+     * @param string     $token  Log token supplied by LogEntries
+     * @param bool       $useSSL Whether or not SSL encryption should be used.
+     * @param string|int $level  The minimum logging level to trigger this handler
+     * @param bool       $bubble Whether or not messages that are handled should bubble up the stack.
+     * @param string     $host   Custom hostname to send the data to if needed
      *
      * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing
      */
-    public function __construct($token, $useSSL = true, $level = Logger::DEBUG, $bubble = true, $host = 'data.logentries.com')
+    public function __construct(string $token, bool $useSSL = true, $level = Logger::DEBUG, bool $bubble = true, string $host = 'data.logentries.com')
     {
         if ($useSSL && !extension_loaded('openssl')) {
             throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler');
@@ -44,11 +45,8 @@ class LogEntriesHandler extends SocketHandler
 
     /**
      * {@inheritdoc}
-     *
-     * @param  array  $record
-     * @return string
      */
-    protected function generateDataStream($record)
+    protected function generateDataStream(array $record): string
     {
         return $this->logToken . ' ' . $record['formatted'];
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php
index bcd62e1..c8befc2 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,7 +12,9 @@
 namespace Monolog\Handler;
 
 use Monolog\Logger;
+use Monolog\Formatter\FormatterInterface;
 use Monolog\Formatter\LogglyFormatter;
+use function array_key_exists;
 
 /**
  * Sends errors to Loggly.
@@ -23,18 +25,32 @@ use Monolog\Formatter\LogglyFormatter;
  */
 class LogglyHandler extends AbstractProcessingHandler
 {
-    const HOST = 'logs-01.loggly.com';
-    const ENDPOINT_SINGLE = 'inputs';
-    const ENDPOINT_BATCH = 'bulk';
+    protected const HOST = 'logs-01.loggly.com';
+    protected const ENDPOINT_SINGLE = 'inputs';
+    protected const ENDPOINT_BATCH = 'bulk';
+
+    /**
+     * Caches the curl handlers for every given endpoint.
+     *
+     * @var array
+     */
+    protected $curlHandlers = [];
 
     protected $token;
 
-    protected $tag = array();
+    protected $tag = [];
 
-    public function __construct($token, $level = Logger::DEBUG, $bubble = true)
+    /**
+     * @param string     $token  API token supplied by Loggly
+     * @param string|int $level  The minimum logging level to trigger this handler
+     * @param bool       $bubble Whether or not messages that are handled should bubble up the stack.
+     *
+     * @throws MissingExtensionException If the curl extension is missing
+     */
+    public function __construct(string $token, $level = Logger::DEBUG, bool $bubble = true)
     {
         if (!extension_loaded('curl')) {
-            throw new \LogicException('The curl extension is needed to use the LogglyHandler');
+            throw new MissingExtensionException('The curl extension is needed to use the LogglyHandler');
         }
 
         $this->token = $token;
@@ -42,26 +58,72 @@ class LogglyHandler extends AbstractProcessingHandler
         parent::__construct($level, $bubble);
     }
 
-    public function setTag($tag)
+    /**
+     * Loads and returns the shared curl handler for the given endpoint.
+     *
+     * @param string $endpoint
+     *
+     * @return resource
+     */
+    protected function getCurlHandler(string $endpoint)
     {
-        $tag = !empty($tag) ? $tag : array();
-        $this->tag = is_array($tag) ? $tag : array($tag);
+        if (!array_key_exists($endpoint, $this->curlHandlers)) {
+            $this->curlHandlers[$endpoint] = $this->loadCurlHandler($endpoint);
+        }
+
+        return $this->curlHandlers[$endpoint];
     }
 
-    public function addTag($tag)
+    /**
+     * Starts a fresh curl session for the given endpoint and returns its handler.
+     *
+     * @param string $endpoint
+     *
+     * @return resource
+     */
+    private function loadCurlHandler(string $endpoint)
+    {
+        $url = sprintf("https://%s/%s/%s/", static::HOST, $endpoint, $this->token);
+
+        $ch = curl_init();
+
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_POST, true);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+
+        return $ch;
+    }
+
+    /**
+     * @param string[]|string $tag
+     */
+    public function setTag($tag): self
+    {
+        $tag = !empty($tag) ? $tag : [];
+        $this->tag = is_array($tag) ? $tag : [$tag];
+
+        return $this;
+    }
+
+    /**
+     * @param string[]|string $tag
+     */
+    public function addTag($tag): self
     {
         if (!empty($tag)) {
-            $tag = is_array($tag) ? $tag : array($tag);
+            $tag = is_array($tag) ? $tag : [$tag];
             $this->tag = array_unique(array_merge($this->tag, $tag));
         }
+
+        return $this;
     }
 
-    protected function write(array $record)
+    protected function write(array $record): void
     {
-        $this->send($record["formatted"], self::ENDPOINT_SINGLE);
+        $this->send($record["formatted"], static::ENDPOINT_SINGLE);
     }
 
-    public function handleBatch(array $records)
+    public function handleBatch(array $records): void
     {
         $level = $this->level;
 
@@ -70,32 +132,27 @@ class LogglyHandler extends AbstractProcessingHandler
         });
 
         if ($records) {
-            $this->send($this->getFormatter()->formatBatch($records), self::ENDPOINT_BATCH);
+            $this->send($this->getFormatter()->formatBatch($records), static::ENDPOINT_BATCH);
         }
     }
 
-    protected function send($data, $endpoint)
+    protected function send(string $data, string $endpoint): void
     {
-        $url = sprintf("https://%s/%s/%s/", self::HOST, $endpoint, $this->token);
+        $ch = $this->getCurlHandler($endpoint);
 
-        $headers = array('Content-Type: application/json');
+        $headers = ['Content-Type: application/json'];
 
         if (!empty($this->tag)) {
             $headers[] = 'X-LOGGLY-TAG: '.implode(',', $this->tag);
         }
 
-        $ch = curl_init();
-
-        curl_setopt($ch, CURLOPT_URL, $url);
-        curl_setopt($ch, CURLOPT_POST, true);
         curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
         curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
-        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
-        Curl\Util::execute($ch);
+        Curl\Util::execute($ch, 5, false);
     }
 
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new LogglyFormatter();
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php
index 9e23283..3bbfd56 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,6 +11,9 @@
 
 namespace Monolog\Handler;
 
+use Monolog\Formatter\FormatterInterface;
+use Monolog\Formatter\HtmlFormatter;
+
 /**
  * Base class for all mail handlers
  *
@@ -21,9 +24,9 @@ abstract class MailHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    public function handleBatch(array $records)
+    public function handleBatch(array $records): void
     {
-        $messages = array();
+        $messages = [];
 
         foreach ($records as $record) {
             if ($record['level'] < $this->level) {
@@ -43,17 +46,17 @@ abstract class MailHandler extends AbstractProcessingHandler
      * @param string $content formatted email body to be sent
      * @param array  $records the array of log records that formed this content
      */
-    abstract protected function send($content, array $records);
+    abstract protected function send(string $content, array $records): void;
 
     /**
      * {@inheritdoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
-        $this->send((string) $record['formatted'], array($record));
+        $this->send((string) $record['formatted'], [$record]);
     }
 
-    protected function getHighestRecord(array $records)
+    protected function getHighestRecord(array $records): array
     {
         $highestRecord = null;
         foreach ($records as $record) {
@@ -64,4 +67,19 @@ abstract class MailHandler extends AbstractProcessingHandler
 
         return $highestRecord;
     }
+
+    protected function isHtmlBody(string $body): bool
+    {
+        return substr($body, 0, 1) === '<';
+    }
+
+    /**
+     * Gets the default formatter.
+     *
+     * @return FormatterInterface
+     */
+    protected function getDefaultFormatter(): FormatterInterface
+    {
+        return new HtmlFormatter();
+    }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php
index 3f0956a..46b8bff 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,6 +12,7 @@
 namespace Monolog\Handler;
 
 use Monolog\Logger;
+use Swift;
 
 /**
  * MandrillHandler uses cURL to send the emails to the Mandrill API
@@ -26,10 +27,10 @@ class MandrillHandler extends MailHandler
     /**
      * @param string                  $apiKey  A valid Mandrill API key
      * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced
-     * @param int                     $level   The minimum logging level at which this handler will be triggered
+     * @param string|int              $level   The minimum logging level at which this handler will be triggered
      * @param bool                    $bubble  Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct($apiKey, $message, $level = Logger::ERROR, $bubble = true)
+    public function __construct(string $apiKey, $message, $level = Logger::ERROR, bool $bubble = true)
     {
         parent::__construct($level, $bubble);
 
@@ -46,22 +47,31 @@ class MandrillHandler extends MailHandler
     /**
      * {@inheritdoc}
      */
-    protected function send($content, array $records)
+    protected function send(string $content, array $records): void
     {
+        $mime = 'text/plain';
+        if ($this->isHtmlBody($content)) {
+            $mime = 'text/html';
+        }
+
         $message = clone $this->message;
-        $message->setBody($content);
-        $message->setDate(time());
+        $message->setBody($content, $mime);
+        if (version_compare(Swift::VERSION, '6.0.0', '>=')) {
+            $message->setDate(new \DateTimeImmutable());
+        } else {
+            $message->setDate(time());
+        }
 
         $ch = curl_init();
 
         curl_setopt($ch, CURLOPT_URL, 'https://mandrillapp.com/api/1.0/messages/send-raw.json');
         curl_setopt($ch, CURLOPT_POST, 1);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array(
+        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
             'key' => $this->apiKey,
             'raw_message' => (string) $message,
             'async' => false,
-        )));
+        ]));
 
         Curl\Util::execute($ch);
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php b/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php
index 4724a7e..3965aee 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,9 +12,9 @@
 namespace Monolog\Handler;
 
 /**
- * Exception can be thrown if an extension for an handler is missing
+ * Exception can be thrown if an extension for a handler is missing
  *
- * @author  Christian Bergau <cbergau86@gmail.com>
+ * @author Christian Bergau <cbergau86@gmail.com>
  */
 class MissingExtensionException extends \Exception
 {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php
index 56fe755..e753917 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,49 +11,75 @@
 
 namespace Monolog\Handler;
 
+use MongoDB\Driver\BulkWrite;
+use MongoDB\Driver\Manager;
+use MongoDB\Client;
 use Monolog\Logger;
-use Monolog\Formatter\NormalizerFormatter;
+use Monolog\Formatter\FormatterInterface;
+use Monolog\Formatter\MongoDBFormatter;
 
 /**
  * Logs to a MongoDB database.
  *
- * usage example:
+ * Usage example:
  *
- *   $log = new Logger('application');
- *   $mongodb = new MongoDBHandler(new \Mongo("mongodb://localhost:27017"), "logs", "prod");
+ *   $log = new \Monolog\Logger('application');
+ *   $client = new \MongoDB\Client('mongodb://localhost:27017');
+ *   $mongodb = new \Monolog\Handler\MongoDBHandler($client, 'logs', 'prod');
  *   $log->pushHandler($mongodb);
  *
- * @author Thomas Tourlourat <thomas@tourlourat.com>
+ * The above examples uses the MongoDB PHP library's client class; however, the
+ * MongoDB\Driver\Manager class from ext-mongodb is also supported.
  */
 class MongoDBHandler extends AbstractProcessingHandler
 {
-    protected $mongoCollection;
+    private $collection;
+    private $manager;
+    private $namespace;
 
-    public function __construct($mongo, $database, $collection, $level = Logger::DEBUG, $bubble = true)
+    /**
+     * Constructor.
+     *
+     * @param Client|Manager $mongodb    MongoDB library or driver client
+     * @param string         $database   Database name
+     * @param string         $collection Collection name
+     * @param string|int     $level      The minimum logging level at which this handler will be triggered
+     * @param bool           $bubble     Whether the messages that are handled can bubble up the stack or not
+     */
+    public function __construct($mongodb, string $database, string $collection, $level = Logger::DEBUG, bool $bubble = true)
     {
-        if (!($mongo instanceof \MongoClient || $mongo instanceof \Mongo || $mongo instanceof \MongoDB\Client)) {
-            throw new \InvalidArgumentException('MongoClient, Mongo or MongoDB\Client instance required');
+        if (!($mongodb instanceof Client || $mongodb instanceof Manager)) {
+            throw new \InvalidArgumentException('MongoDB\Client or MongoDB\Driver\Manager instance required');
         }
 
-        $this->mongoCollection = $mongo->selectCollection($database, $collection);
+        if ($mongodb instanceof Client) {
+            $this->collection = $mongodb->selectCollection($database, $collection);
+        } else {
+            $this->manager = $mongodb;
+            $this->namespace = $database . '.' . $collection;
+        }
 
         parent::__construct($level, $bubble);
     }
 
-    protected function write(array $record)
+    protected function write(array $record): void
     {
-        if ($this->mongoCollection instanceof \MongoDB\Collection) {
-            $this->mongoCollection->insertOne($record["formatted"]);
-        } else {
-            $this->mongoCollection->save($record["formatted"]);
+        if (isset($this->collection)) {
+            $this->collection->insertOne($record['formatted']);
+        }
+
+        if (isset($this->manager, $this->namespace)) {
+            $bulk = new BulkWrite;
+            $bulk->insert($record["formatted"]);
+            $this->manager->executeBulkWrite($this->namespace, $bulk);
         }
     }
 
     /**
      * {@inheritDoc}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
-        return new NormalizerFormatter();
+        return new MongoDBFormatter;
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php
index d7807fd..cd20561 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -38,13 +38,13 @@ class NativeMailerHandler extends MailHandler
      * Optional headers for the message
      * @var array
      */
-    protected $headers = array();
+    protected $headers = [];
 
     /**
      * Optional parameters for the message
      * @var array
      */
-    protected $parameters = array();
+    protected $parameters = [];
 
     /**
      * The wordwrap length for the message
@@ -54,9 +54,9 @@ class NativeMailerHandler extends MailHandler
 
     /**
      * The Content-type for the message
-     * @var string
+     * @var string|null
      */
-    protected $contentType = 'text/plain';
+    protected $contentType;
 
     /**
      * The encoding for the message
@@ -68,14 +68,14 @@ class NativeMailerHandler extends MailHandler
      * @param string|array $to             The receiver of the mail
      * @param string       $subject        The subject of the mail
      * @param string       $from           The sender of the mail
-     * @param int          $level          The minimum logging level at which this handler will be triggered
+     * @param string|int   $level          The minimum logging level at which this handler will be triggered
      * @param bool         $bubble         Whether the messages that are handled can bubble up the stack or not
      * @param int          $maxColumnWidth The maximum column width that the message lines will have
      */
-    public function __construct($to, $subject, $from, $level = Logger::ERROR, $bubble = true, $maxColumnWidth = 70)
+    public function __construct($to, string $subject, string $from, $level = Logger::ERROR, bool $bubble = true, int $maxColumnWidth = 70)
     {
         parent::__construct($level, $bubble);
-        $this->to = is_array($to) ? $to : array($to);
+        $this->to = (array) $to;
         $this->subject = $subject;
         $this->addHeader(sprintf('From: %s', $from));
         $this->maxColumnWidth = $maxColumnWidth;
@@ -84,10 +84,9 @@ class NativeMailerHandler extends MailHandler
     /**
      * Add headers to the message
      *
-     * @param  string|array $headers Custom added headers
-     * @return self
+     * @param string|array $headers Custom added headers
      */
-    public function addHeader($headers)
+    public function addHeader($headers): self
     {
         foreach ((array) $headers as $header) {
             if (strpos($header, "\n") !== false || strpos($header, "\r") !== false) {
@@ -102,10 +101,9 @@ class NativeMailerHandler extends MailHandler
     /**
      * Add parameters to the message
      *
-     * @param  string|array $parameters Custom added parameters
-     * @return self
+     * @param string|array $parameters Custom added parameters
      */
-    public function addParameter($parameters)
+    public function addParameter($parameters): self
     {
         $this->parameters = array_merge($this->parameters, (array) $parameters);
 
@@ -115,12 +113,17 @@ class NativeMailerHandler extends MailHandler
     /**
      * {@inheritdoc}
      */
-    protected function send($content, array $records)
+    protected function send(string $content, array $records): void
     {
-        $content = wordwrap($content, $this->maxColumnWidth);
+        $contentType = $this->getContentType() ?: ($this->isHtmlBody($content) ? 'text/html' : 'text/plain');
+
+        if ($contentType !== 'text/html') {
+            $content = wordwrap($content, $this->maxColumnWidth);
+        }
+
         $headers = ltrim(implode("\r\n", $this->headers) . "\r\n", "\r\n");
-        $headers .= 'Content-type: ' . $this->getContentType() . '; charset=' . $this->getEncoding() . "\r\n";
-        if ($this->getContentType() == 'text/html' && false === strpos($headers, 'MIME-Version:')) {
+        $headers .= 'Content-type: ' . $contentType . '; charset=' . $this->getEncoding() . "\r\n";
+        if ($contentType === 'text/html' && false === strpos($headers, 'MIME-Version:')) {
             $headers .= 'MIME-Version: 1.0' . "\r\n";
         }
 
@@ -136,28 +139,20 @@ class NativeMailerHandler extends MailHandler
         }
     }
 
-    /**
-     * @return string $contentType
-     */
-    public function getContentType()
+    public function getContentType(): ?string
     {
         return $this->contentType;
     }
 
-    /**
-     * @return string $encoding
-     */
-    public function getEncoding()
+    public function getEncoding(): string
     {
         return $this->encoding;
     }
 
     /**
-     * @param  string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML
-     *                             messages.
-     * @return self
+     * @param string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML messages.
      */
-    public function setContentType($contentType)
+    public function setContentType(string $contentType): self
     {
         if (strpos($contentType, "\n") !== false || strpos($contentType, "\r") !== false) {
             throw new \InvalidArgumentException('The content type can not contain newline characters to prevent email header injection');
@@ -168,11 +163,7 @@ class NativeMailerHandler extends MailHandler
         return $this;
     }
 
-    /**
-     * @param  string $encoding
-     * @return self
-     */
-    public function setEncoding($encoding)
+    public function setEncoding(string $encoding): self
     {
         if (strpos($encoding, "\n") !== false || strpos($encoding, "\r") !== false) {
             throw new \InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection');
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php
index f911997..177ad21 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,7 +12,9 @@
 namespace Monolog\Handler;
 
 use Monolog\Logger;
+use Monolog\Utils;
 use Monolog\Formatter\NormalizerFormatter;
+use Monolog\Formatter\FormatterInterface;
 
 /**
  * Class to record a log on a NewRelic application.
@@ -28,14 +30,14 @@ class NewRelicHandler extends AbstractProcessingHandler
     /**
      * Name of the New Relic application that will receive logs from this handler.
      *
-     * @var string
+     * @var string|null
      */
     protected $appName;
 
     /**
      * Name of the current transaction
      *
-     * @var string
+     * @var string|null
      */
     protected $transactionName;
 
@@ -50,16 +52,18 @@ class NewRelicHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      *
-     * @param string $appName
-     * @param bool   $explodeArrays
-     * @param string $transactionName
+     * @param string|int  $level           The minimum logging level at which this handler will be triggered.
+     * @param bool        $bubble          Whether the messages that are handled can bubble up the stack or not.
+     * @param string|null $appName
+     * @param bool        $explodeArrays
+     * @param string|null $transactionName
      */
     public function __construct(
         $level = Logger::ERROR,
-        $bubble = true,
-        $appName = null,
-        $explodeArrays = false,
-        $transactionName = null
+        bool $bubble = true,
+        ?string $appName = null,
+        bool $explodeArrays = false,
+        ?string $transactionName = null
     ) {
         parent::__construct($level, $bubble);
 
@@ -71,7 +75,7 @@ class NewRelicHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         if (!$this->isNewRelicEnabled()) {
             throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler');
@@ -86,7 +90,7 @@ class NewRelicHandler extends AbstractProcessingHandler
             unset($record['formatted']['context']['transaction_name']);
         }
 
-        if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \Exception || (PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \Throwable))) {
+        if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Throwable) {
             newrelic_notice_error($record['message'], $record['context']['exception']);
             unset($record['formatted']['context']['exception']);
         } else {
@@ -123,7 +127,7 @@ class NewRelicHandler extends AbstractProcessingHandler
      *
      * @return bool
      */
-    protected function isNewRelicEnabled()
+    protected function isNewRelicEnabled(): bool
     {
         return extension_loaded('newrelic');
     }
@@ -131,11 +135,8 @@ class NewRelicHandler extends AbstractProcessingHandler
     /**
      * Returns the appname where this log should be sent. Each log can override the default appname, set in this
      * handler's constructor, by providing the appname in it's context.
-     *
-     * @param  array       $context
-     * @return null|string
      */
-    protected function getAppName(array $context)
+    protected function getAppName(array $context): ?string
     {
         if (isset($context['appname'])) {
             return $context['appname'];
@@ -147,12 +148,8 @@ class NewRelicHandler extends AbstractProcessingHandler
     /**
      * Returns the name of the current transaction. Each log can override the default transaction name, set in this
      * handler's constructor, by providing the transaction_name in it's context
-     *
-     * @param array $context
-     *
-     * @return null|string
      */
-    protected function getTransactionName(array $context)
+    protected function getTransactionName(array $context): ?string
     {
         if (isset($context['transaction_name'])) {
             return $context['transaction_name'];
@@ -163,20 +160,16 @@ class NewRelicHandler extends AbstractProcessingHandler
 
     /**
      * Sets the NewRelic application that should receive this log.
-     *
-     * @param string $appName
      */
-    protected function setNewRelicAppName($appName)
+    protected function setNewRelicAppName(string $appName): void
     {
         newrelic_set_appname($appName);
     }
 
     /**
      * Overwrites the name of the current transaction
-     *
-     * @param string $transactionName
      */
-    protected function setNewRelicTransactionName($transactionName)
+    protected function setNewRelicTransactionName(string $transactionName): void
     {
         newrelic_name_transaction($transactionName);
     }
@@ -185,19 +178,19 @@ class NewRelicHandler extends AbstractProcessingHandler
      * @param string $key
      * @param mixed  $value
      */
-    protected function setNewRelicParameter($key, $value)
+    protected function setNewRelicParameter(string $key, $value): void
     {
         if (null === $value || is_scalar($value)) {
             newrelic_add_custom_parameter($key, $value);
         } else {
-            newrelic_add_custom_parameter($key, @json_encode($value));
+            newrelic_add_custom_parameter($key, Utils::jsonEncode($value, null, true));
         }
     }
 
     /**
      * {@inheritDoc}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new NormalizerFormatter();
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php
index 4b84588..1f0078a 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -21,25 +21,34 @@ use Monolog\Logger;
  *
  * @author Jordi Boggiano <j.boggiano@seld.be>
  */
-class NullHandler extends AbstractHandler
+class NullHandler extends Handler
 {
     /**
-     * @param int $level The minimum logging level at which this handler will be triggered
+     * @var int
+     */
+    private $level;
+
+    /**
+     * @param string|int $level The minimum logging level at which this handler will be triggered
      */
     public function __construct($level = Logger::DEBUG)
     {
-        parent::__construct($level, false);
+        $this->level = Logger::toMonologLevel($level);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function handle(array $record)
+    public function isHandling(array $record): bool
     {
-        if ($record['level'] < $this->level) {
-            return false;
-        }
+        return $record['level'] >= $this->level;
+    }
 
-        return true;
+    /**
+     * {@inheritdoc}
+     */
+    public function handle(array $record): bool
+    {
+        return $record['level'] >= $this->level;
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php
index 1f2076a..aa94e61 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,11 +11,12 @@
 
 namespace Monolog\Handler;
 
-use Exception;
 use Monolog\Formatter\LineFormatter;
+use Monolog\Formatter\FormatterInterface;
 use Monolog\Logger;
+use Monolog\Utils;
 use PhpConsole\Connector;
-use PhpConsole\Handler;
+use PhpConsole\Handler as VendorPhpConsoleHandler;
 use PhpConsole\Helper;
 
 /**
@@ -32,17 +33,17 @@ use PhpConsole\Helper;
  *      $logger = new \Monolog\Logger('all', array(new \Monolog\Handler\PHPConsoleHandler()));
  *      \Monolog\ErrorHandler::register($logger);
  *      echo $undefinedVar;
- *      $logger->addDebug('SELECT * FROM users', array('db', 'time' => 0.012));
+ *      $logger->debug('SELECT * FROM users', array('db', 'time' => 0.012));
  *      PC::debug($_SERVER); // PHP Console debugger for any type of vars
  *
  * @author Sergey Barbushin https://www.linkedin.com/in/barbushin
  */
 class PHPConsoleHandler extends AbstractProcessingHandler
 {
-    private $options = array(
+    private $options = [
         'enabled' => true, // bool Is PHP Console server enabled
-        'classesPartialsTraceIgnore' => array('Monolog\\'), // array Hide calls of classes started with...
-        'debugTagsKeysInContext' => array(0, 'tag'), // bool Is PHP Console server enabled
+        'classesPartialsTraceIgnore' => ['Monolog\\'], // array Hide calls of classes started with...
+        'debugTagsKeysInContext' => [0, 'tag'], // bool Is PHP Console server enabled
         'useOwnErrorsHandler' => false, // bool Enable errors handling
         'useOwnExceptionsHandler' => false, // bool Enable exceptions handling
         'sourcesBasePath' => null, // string Base path of all project sources to strip in errors source paths
@@ -51,7 +52,7 @@ class PHPConsoleHandler extends AbstractProcessingHandler
         'headersLimit' => null, // int|null Set headers size limit for your web-server
         'password' => null, // string|null Protect PHP Console connection by password
         'enableSslOnlyMode' => false, // bool Force connection by SSL for clients with PHP Console installed
-        'ipMasks' => array(), // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1')
+        'ipMasks' => [], // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1')
         'enableEvalListener' => false, // bool Enable eval request to be handled by eval dispatcher(if enabled, 'password' option is also required)
         'dumperDetectCallbacks' => false, // bool Convert callback items in dumper vars to (callback SomeClass::someMethod) strings
         'dumperLevelLimit' => 5, // int Maximum dumped vars array or object nested dump level
@@ -59,40 +60,43 @@ class PHPConsoleHandler extends AbstractProcessingHandler
         'dumperItemSizeLimit' => 5000, // int Maximum length of any string or dumped array item
         'dumperDumpSizeLimit' => 500000, // int Maximum approximate size of dumped vars result formatted in JSON
         'detectDumpTraceAndSource' => false, // bool Autodetect and append trace data to debug
-        'dataStorage' => null, // PhpConsole\Storage|null Fixes problem with custom $_SESSION handler(see http://goo.gl/Ne8juJ)
-    );
+        'dataStorage' => null, // \PhpConsole\Storage|null Fixes problem with custom $_SESSION handler(see http://goo.gl/Ne8juJ)
+    ];
 
     /** @var Connector */
     private $connector;
 
     /**
-     * @param  array          $options   See \Monolog\Handler\PHPConsoleHandler::$options for more details
-     * @param  Connector|null $connector Instance of \PhpConsole\Connector class (optional)
-     * @param  int            $level
-     * @param  bool           $bubble
-     * @throws Exception
+     * @param  array             $options   See \Monolog\Handler\PHPConsoleHandler::$options for more details
+     * @param  Connector|null    $connector Instance of \PhpConsole\Connector class (optional)
+     * @param  string|int        $level     The minimum logging level at which this handler will be triggered.
+     * @param  bool              $bubble    Whether the messages that are handled can bubble up the stack or not.
+     * @throws \RuntimeException
      */
-    public function __construct(array $options = array(), Connector $connector = null, $level = Logger::DEBUG, $bubble = true)
+    public function __construct(array $options = [], ?Connector $connector = null, $level = Logger::DEBUG, bool $bubble = true)
     {
         if (!class_exists('PhpConsole\Connector')) {
-            throw new Exception('PHP Console library not found. See https://github.com/barbushin/php-console#installation');
+            throw new \RuntimeException('PHP Console library not found. See https://github.com/barbushin/php-console#installation');
         }
         parent::__construct($level, $bubble);
         $this->options = $this->initOptions($options);
         $this->connector = $this->initConnector($connector);
     }
 
-    private function initOptions(array $options)
+    private function initOptions(array $options): array
     {
         $wrongOptions = array_diff(array_keys($options), array_keys($this->options));
         if ($wrongOptions) {
-            throw new Exception('Unknown options: ' . implode(', ', $wrongOptions));
+            throw new \RuntimeException('Unknown options: ' . implode(', ', $wrongOptions));
         }
 
         return array_replace($this->options, $options);
     }
 
-    private function initConnector(Connector $connector = null)
+    /**
+     * @suppress PhanTypeMismatchArgument
+     */
+    private function initConnector(?Connector $connector = null): Connector
     {
         if (!$connector) {
             if ($this->options['dataStorage']) {
@@ -107,7 +111,7 @@ class PHPConsoleHandler extends AbstractProcessingHandler
 
         if ($this->options['enabled'] && $connector->isActiveClient()) {
             if ($this->options['useOwnErrorsHandler'] || $this->options['useOwnExceptionsHandler']) {
-                $handler = Handler::getInstance();
+                $handler = VendorPhpConsoleHandler::getInstance();
                 $handler->setHandleErrors($this->options['useOwnErrorsHandler']);
                 $handler->setHandleExceptions($this->options['useOwnExceptionsHandler']);
                 $handler->start();
@@ -147,17 +151,17 @@ class PHPConsoleHandler extends AbstractProcessingHandler
         return $connector;
     }
 
-    public function getConnector()
+    public function getConnector(): Connector
     {
         return $this->connector;
     }
 
-    public function getOptions()
+    public function getOptions(): array
     {
         return $this->options;
     }
 
-    public function handle(array $record)
+    public function handle(array $record): bool
     {
         if ($this->options['enabled'] && $this->connector->isActiveClient()) {
             return parent::handle($record);
@@ -168,45 +172,42 @@ class PHPConsoleHandler extends AbstractProcessingHandler
 
     /**
      * Writes the record down to the log of the implementing handler
-     *
-     * @param  array $record
-     * @return void
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         if ($record['level'] < Logger::NOTICE) {
             $this->handleDebugRecord($record);
-        } elseif (isset($record['context']['exception']) && $record['context']['exception'] instanceof Exception) {
+        } elseif (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Throwable) {
             $this->handleExceptionRecord($record);
         } else {
             $this->handleErrorRecord($record);
         }
     }
 
-    private function handleDebugRecord(array $record)
+    private function handleDebugRecord(array $record): void
     {
         $tags = $this->getRecordTags($record);
         $message = $record['message'];
         if ($record['context']) {
-            $message .= ' ' . json_encode($this->connector->getDumper()->dump(array_filter($record['context'])));
+            $message .= ' ' . Utils::jsonEncode($this->connector->getDumper()->dump(array_filter($record['context'])), null, true);
         }
         $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']);
     }
 
-    private function handleExceptionRecord(array $record)
+    private function handleExceptionRecord(array $record): void
     {
         $this->connector->getErrorsDispatcher()->dispatchException($record['context']['exception']);
     }
 
-    private function handleErrorRecord(array $record)
+    private function handleErrorRecord(array $record): void
     {
         $context = $record['context'];
 
         $this->connector->getErrorsDispatcher()->dispatchError(
-            isset($context['code']) ? $context['code'] : null,
-            isset($context['message']) ? $context['message'] : $record['message'],
-            isset($context['file']) ? $context['file'] : null,
-            isset($context['line']) ? $context['line'] : null,
+            $context['code'] ?? null,
+            $context['message'] ?? $record['message'],
+            $context['file'] ?? null,
+            $context['line'] ?? null,
             $this->options['classesPartialsTraceIgnore']
         );
     }
@@ -235,7 +236,7 @@ class PHPConsoleHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new LineFormatter('%message%');
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php
index a99e6ab..cba96a5 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -13,13 +13,18 @@ namespace Monolog\Handler;
 
 use Monolog\Logger;
 use Psr\Log\LoggerInterface;
+use Monolog\Formatter\FormatterInterface;
 
 /**
  * Proxies log messages to an existing PSR-3 compliant logger.
  *
+ * If a formatter is configured, the formatter's output MUST be a string and the
+ * formatted message will be fed to the wrapped PSR logger instead of the original
+ * log record's message.
+ *
  * @author Michael Moussa <michael.moussa@gmail.com>
  */
-class PsrHandler extends AbstractHandler
+class PsrHandler extends AbstractHandler implements FormattableHandlerInterface
 {
     /**
      * PSR-3 compliant logger
@@ -29,11 +34,16 @@ class PsrHandler extends AbstractHandler
     protected $logger;
 
     /**
+     * @var FormatterInterface|null
+     */
+    protected $formatter;
+
+    /**
      * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied
-     * @param int             $level  The minimum logging level at which this handler will be triggered
+     * @param string|int      $level  The minimum logging level at which this handler will be triggered
      * @param bool            $bubble Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, $bubble = true)
+    public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, bool $bubble = true)
     {
         parent::__construct($level, $bubble);
 
@@ -43,14 +53,45 @@ class PsrHandler extends AbstractHandler
     /**
      * {@inheritDoc}
      */
-    public function handle(array $record)
+    public function handle(array $record): bool
     {
         if (!$this->isHandling($record)) {
             return false;
         }
 
-        $this->logger->log(strtolower($record['level_name']), $record['message'], $record['context']);
+        if ($this->formatter) {
+            $formatted = $this->formatter->format($record);
+            $this->logger->log(strtolower($record['level_name']), (string) $formatted, $record['context']);
+        } else {
+            $this->logger->log(strtolower($record['level_name']), $record['message'], $record['context']);
+        }
 
         return false === $this->bubble;
     }
+
+    /**
+     * Sets the formatter.
+     *
+     * @param FormatterInterface $formatter
+     */
+    public function setFormatter(FormatterInterface $formatter): HandlerInterface
+    {
+        $this->formatter = $formatter;
+
+        return $this;
+    }
+
+    /**
+     * Gets the formatter.
+     *
+     * @return FormatterInterface
+     */
+    public function getFormatter(): FormatterInterface
+    {
+        if (!$this->formatter) {
+            throw new \LogicException('No formatter has been set and this handler does not have a default formatter');
+        }
+
+        return $this->formatter;
+    }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php
index f27bb3d..3bb99c7 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,6 +12,7 @@
 namespace Monolog\Handler;
 
 use Monolog\Logger;
+use Monolog\Utils;
 
 /**
  * Sends notifications through the pushover api to mobile phones
@@ -37,7 +38,7 @@ class PushoverHandler extends SocketHandler
      * @see https://pushover.net/api
      * @var array
      */
-    private $parameterNames = array(
+    private $parameterNames = [
         'token' => true,
         'user' => true,
         'message' => true,
@@ -51,36 +52,48 @@ class PushoverHandler extends SocketHandler
         'retry' => true,
         'expire' => true,
         'callback' => true,
-    );
+    ];
 
     /**
      * Sounds the api supports by default
      * @see https://pushover.net/api#sounds
      * @var array
      */
-    private $sounds = array(
+    private $sounds = [
         'pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming',
         'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb',
         'persistent', 'echo', 'updown', 'none',
-    );
+    ];
 
     /**
      * @param string       $token             Pushover api token
      * @param string|array $users             Pushover user id or array of ids the message will be sent to
-     * @param string       $title             Title sent to the Pushover API
-     * @param int          $level             The minimum logging level at which this handler will be triggered
+     * @param string|null  $title             Title sent to the Pushover API
+     * @param string|int   $level             The minimum logging level at which this handler will be triggered
      * @param bool         $bubble            Whether the messages that are handled can bubble up the stack or not
      * @param bool         $useSSL            Whether to connect via SSL. Required when pushing messages to users that are not
      *                                        the pushover.net app owner. OpenSSL is required for this option.
-     * @param int          $highPriorityLevel The minimum logging level at which this handler will start
+     * @param string|int   $highPriorityLevel The minimum logging level at which this handler will start
      *                                        sending "high priority" requests to the Pushover API
-     * @param int          $emergencyLevel    The minimum logging level at which this handler will start
+     * @param string|int   $emergencyLevel    The minimum logging level at which this handler will start
      *                                        sending "emergency" requests to the Pushover API
-     * @param int          $retry             The retry parameter specifies how often (in seconds) the Pushover servers will send the same notification to the user.
-     * @param int          $expire            The expire parameter specifies how many seconds your notification will continue to be retried for (every retry seconds).
+     * @param int          $retry             The retry parameter specifies how often (in seconds) the Pushover servers will
+     *                                        send the same notification to the user.
+     * @param int          $expire            The expire parameter specifies how many seconds your notification will continue
+     *                                        to be retried for (every retry seconds).
      */
-    public function __construct($token, $users, $title = null, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $highPriorityLevel = Logger::CRITICAL, $emergencyLevel = Logger::EMERGENCY, $retry = 30, $expire = 25200)
-    {
+    public function __construct(
+        string $token,
+        $users,
+        ?string $title = null,
+        $level = Logger::CRITICAL,
+        bool $bubble = true,
+        bool $useSSL = true,
+        $highPriorityLevel = Logger::CRITICAL,
+        $emergencyLevel = Logger::EMERGENCY,
+        int $retry = 30,
+        int $expire = 25200
+    ) {
         $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80';
         parent::__construct($connectionString, $level, $bubble);
 
@@ -93,30 +106,30 @@ class PushoverHandler extends SocketHandler
         $this->expire = $expire;
     }
 
-    protected function generateDataStream($record)
+    protected function generateDataStream(array $record): string
     {
         $content = $this->buildContent($record);
 
         return $this->buildHeader($content) . $content;
     }
 
-    private function buildContent($record)
+    private function buildContent(array $record): string
     {
         // Pushover has a limit of 512 characters on title and message combined.
         $maxMessageLength = 512 - strlen($this->title);
 
         $message = ($this->useFormattedMessage) ? $record['formatted'] : $record['message'];
-        $message = substr($message, 0, $maxMessageLength);
+        $message = Utils::substr($message, 0, $maxMessageLength);
 
         $timestamp = $record['datetime']->getTimestamp();
 
-        $dataArray = array(
+        $dataArray = [
             'token' => $this->token,
             'user' => $this->user,
             'message' => $message,
             'title' => $this->title,
             'timestamp' => $timestamp,
-        );
+        ];
 
         if (isset($record['level']) && $record['level'] >= $this->emergencyLevel) {
             $dataArray['priority'] = 2;
@@ -141,7 +154,7 @@ class PushoverHandler extends SocketHandler
         return http_build_query($dataArray);
     }
 
-    private function buildHeader($content)
+    private function buildHeader(string $content): string
     {
         $header = "POST /1/messages.json HTTP/1.1\r\n";
         $header .= "Host: api.pushover.net\r\n";
@@ -152,7 +165,7 @@ class PushoverHandler extends SocketHandler
         return $header;
     }
 
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         foreach ($this->users as $user) {
             $this->user = $user;
@@ -164,22 +177,27 @@ class PushoverHandler extends SocketHandler
         $this->user = null;
     }
 
-    public function setHighPriorityLevel($value)
+    public function setHighPriorityLevel($value): self
     {
-        $this->highPriorityLevel = $value;
+        $this->highPriorityLevel = Logger::toMonologLevel($value);
+
+        return $this;
     }
 
-    public function setEmergencyLevel($value)
+    public function setEmergencyLevel($value): self
     {
-        $this->emergencyLevel = $value;
+        $this->emergencyLevel = Logger::toMonologLevel($value);
+
+        return $this;
     }
 
     /**
      * Use the formatted message?
-     * @param bool $value
      */
-    public function useFormattedMessage($value)
+    public function useFormattedMessage(bool $value): self
     {
-        $this->useFormattedMessage = (bool) $value;
+        $this->useFormattedMessage = $value;
+
+        return $this;
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php
deleted file mode 100644
index 10d7f43..0000000
--- a/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php
+++ /dev/null
@@ -1,232 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\Formatter\LineFormatter;
-use Monolog\Formatter\FormatterInterface;
-use Monolog\Logger;
-use Raven_Client;
-
-/**
- * Handler to send messages to a Sentry (https://github.com/getsentry/sentry) server
- * using sentry-php (https://github.com/getsentry/sentry-php)
- *
- * @author Marc Abramowitz <marc@marc-abramowitz.com>
- */
-class RavenHandler extends AbstractProcessingHandler
-{
-    /**
-     * Translates Monolog log levels to Raven log levels.
-     */
-    protected $logLevels = array(
-        Logger::DEBUG     => Raven_Client::DEBUG,
-        Logger::INFO      => Raven_Client::INFO,
-        Logger::NOTICE    => Raven_Client::INFO,
-        Logger::WARNING   => Raven_Client::WARNING,
-        Logger::ERROR     => Raven_Client::ERROR,
-        Logger::CRITICAL  => Raven_Client::FATAL,
-        Logger::ALERT     => Raven_Client::FATAL,
-        Logger::EMERGENCY => Raven_Client::FATAL,
-    );
-
-    /**
-     * @var string should represent the current version of the calling
-     *             software. Can be any string (git commit, version number)
-     */
-    protected $release;
-
-    /**
-     * @var Raven_Client the client object that sends the message to the server
-     */
-    protected $ravenClient;
-
-    /**
-     * @var LineFormatter The formatter to use for the logs generated via handleBatch()
-     */
-    protected $batchFormatter;
-
-    /**
-     * @param Raven_Client $ravenClient
-     * @param int          $level       The minimum logging level at which this handler will be triggered
-     * @param bool         $bubble      Whether the messages that are handled can bubble up the stack or not
-     */
-    public function __construct(Raven_Client $ravenClient, $level = Logger::DEBUG, $bubble = true)
-    {
-        parent::__construct($level, $bubble);
-
-        $this->ravenClient = $ravenClient;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function handleBatch(array $records)
-    {
-        $level = $this->level;
-
-        // filter records based on their level
-        $records = array_filter($records, function ($record) use ($level) {
-            return $record['level'] >= $level;
-        });
-
-        if (!$records) {
-            return;
-        }
-
-        // the record with the highest severity is the "main" one
-        $record = array_reduce($records, function ($highest, $record) {
-            if ($record['level'] > $highest['level']) {
-                return $record;
-            }
-
-            return $highest;
-        });
-
-        // the other ones are added as a context item
-        $logs = array();
-        foreach ($records as $r) {
-            $logs[] = $this->processRecord($r);
-        }
-
-        if ($logs) {
-            $record['context']['logs'] = (string) $this->getBatchFormatter()->formatBatch($logs);
-        }
-
-        $this->handle($record);
-    }
-
-    /**
-     * Sets the formatter for the logs generated by handleBatch().
-     *
-     * @param FormatterInterface $formatter
-     */
-    public function setBatchFormatter(FormatterInterface $formatter)
-    {
-        $this->batchFormatter = $formatter;
-    }
-
-    /**
-     * Gets the formatter for the logs generated by handleBatch().
-     *
-     * @return FormatterInterface
-     */
-    public function getBatchFormatter()
-    {
-        if (!$this->batchFormatter) {
-            $this->batchFormatter = $this->getDefaultBatchFormatter();
-        }
-
-        return $this->batchFormatter;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function write(array $record)
-    {
-        $previousUserContext = false;
-        $options = array();
-        $options['level'] = $this->logLevels[$record['level']];
-        $options['tags'] = array();
-        if (!empty($record['extra']['tags'])) {
-            $options['tags'] = array_merge($options['tags'], $record['extra']['tags']);
-            unset($record['extra']['tags']);
-        }
-        if (!empty($record['context']['tags'])) {
-            $options['tags'] = array_merge($options['tags'], $record['context']['tags']);
-            unset($record['context']['tags']);
-        }
-        if (!empty($record['context']['fingerprint'])) {
-            $options['fingerprint'] = $record['context']['fingerprint'];
-            unset($record['context']['fingerprint']);
-        }
-        if (!empty($record['context']['logger'])) {
-            $options['logger'] = $record['context']['logger'];
-            unset($record['context']['logger']);
-        } else {
-            $options['logger'] = $record['channel'];
-        }
-        foreach ($this->getExtraParameters() as $key) {
-            foreach (array('extra', 'context') as $source) {
-                if (!empty($record[$source][$key])) {
-                    $options[$key] = $record[$source][$key];
-                    unset($record[$source][$key]);
-                }
-            }
-        }
-        if (!empty($record['context'])) {
-            $options['extra']['context'] = $record['context'];
-            if (!empty($record['context']['user'])) {
-                $previousUserContext = $this->ravenClient->context->user;
-                $this->ravenClient->user_context($record['context']['user']);
-                unset($options['extra']['context']['user']);
-            }
-        }
-        if (!empty($record['extra'])) {
-            $options['extra']['extra'] = $record['extra'];
-        }
-
-        if (!empty($this->release) && !isset($options['release'])) {
-            $options['release'] = $this->release;
-        }
-
-        if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \Exception || (PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \Throwable))) {
-            $options['message'] = $record['formatted'];
-            $this->ravenClient->captureException($record['context']['exception'], $options);
-        } else {
-            $this->ravenClient->captureMessage($record['formatted'], array(), $options);
-        }
-
-        if ($previousUserContext !== false) {
-            $this->ravenClient->user_context($previousUserContext);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function getDefaultFormatter()
-    {
-        return new LineFormatter('[%channel%] %message%');
-    }
-
-    /**
-     * Gets the default formatter for the logs generated by handleBatch().
-     *
-     * @return FormatterInterface
-     */
-    protected function getDefaultBatchFormatter()
-    {
-        return new LineFormatter();
-    }
-
-    /**
-     * Gets extra parameters supported by Raven that can be found in "extra" and "context"
-     *
-     * @return array
-     */
-    protected function getExtraParameters()
-    {
-        return array('contexts', 'checksum', 'release', 'event_id');
-    }
-
-    /**
-     * @param string $value
-     * @return self
-     */
-    public function setRelease($value)
-    {
-        $this->release = $value;
-
-        return $this;
-    }
-}
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php
index 590f996..3894513 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,6 +12,7 @@
 namespace Monolog\Handler;
 
 use Monolog\Formatter\LineFormatter;
+use Monolog\Formatter\FormatterInterface;
 use Monolog\Logger;
 
 /**
@@ -34,11 +35,11 @@ class RedisHandler extends AbstractProcessingHandler
     /**
      * @param \Predis\Client|\Redis $redis   The redis instance
      * @param string                $key     The key name to push records to
-     * @param int                   $level   The minimum logging level at which this handler will be triggered
+     * @param string|int            $level   The minimum logging level at which this handler will be triggered
      * @param bool                  $bubble  Whether the messages that are handled can bubble up the stack or not
-     * @param int                   $capSize Number of entries to limit list size to
+     * @param int                   $capSize Number of entries to limit list size to, 0 = unlimited
      */
-    public function __construct($redis, $key, $level = Logger::DEBUG, $bubble = true, $capSize = false)
+    public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true, int $capSize = 0)
     {
         if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) {
             throw new \InvalidArgumentException('Predis\Client or Redis instance required');
@@ -54,7 +55,7 @@ class RedisHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         if ($this->capSize) {
             $this->writeCapped($record);
@@ -66,11 +67,8 @@ class RedisHandler extends AbstractProcessingHandler
     /**
      * Write and cap the collection
      * Writes the record to the redis list and caps its
-     *
-     * @param  array $record associative record array
-     * @return void
      */
-    protected function writeCapped(array $record)
+    protected function writeCapped(array $record): void
     {
         if ($this->redisClient instanceof \Redis) {
             $this->redisClient->multi()
@@ -90,7 +88,7 @@ class RedisHandler extends AbstractProcessingHandler
     /**
      * {@inheritDoc}
      */
-    protected function getDefaultFormatter()
+    protected function getDefaultFormatter(): FormatterInterface
     {
         return new LineFormatter();
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php
index 65073ff..979d651 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,15 +11,15 @@
 
 namespace Monolog\Handler;
 
-use RollbarNotifier;
-use Exception;
+use Rollbar\RollbarLogger;
+use Throwable;
 use Monolog\Logger;
 
 /**
  * Sends errors to Rollbar
  *
  * If the context data contains a `payload` key, that is used as an array
- * of payload options to RollbarNotifier's report_message/report_exception methods.
+ * of payload options to RollbarLogger's log method.
  *
  * Rollbar's context info will contain the context + extra keys from the log record
  * merged, and then on top of that a few keys:
@@ -34,13 +34,11 @@ use Monolog\Logger;
 class RollbarHandler extends AbstractProcessingHandler
 {
     /**
-     * Rollbar notifier
-     *
-     * @var RollbarNotifier
+     * @var RollbarLogger
      */
-    protected $rollbarNotifier;
+    protected $rollbarLogger;
 
-    protected $levelMap = array(
+    protected $levelMap = [
         Logger::DEBUG     => 'debug',
         Logger::INFO      => 'info',
         Logger::NOTICE    => 'info',
@@ -49,7 +47,7 @@ class RollbarHandler extends AbstractProcessingHandler
         Logger::CRITICAL  => 'critical',
         Logger::ALERT     => 'critical',
         Logger::EMERGENCY => 'critical',
-    );
+    ];
 
     /**
      * Records whether any log records have been added since the last flush of the rollbar notifier
@@ -61,13 +59,13 @@ class RollbarHandler extends AbstractProcessingHandler
     protected $initialized = false;
 
     /**
-     * @param RollbarNotifier $rollbarNotifier RollbarNotifier object constructed with valid token
-     * @param int             $level           The minimum logging level at which this handler will be triggered
-     * @param bool            $bubble          Whether the messages that are handled can bubble up the stack or not
+     * @param RollbarLogger $rollbarLogger RollbarLogger object constructed with valid token
+     * @param string|int    $level         The minimum logging level at which this handler will be triggered
+     * @param bool          $bubble        Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct(RollbarNotifier $rollbarNotifier, $level = Logger::ERROR, $bubble = true)
+    public function __construct(RollbarLogger $rollbarLogger, $level = Logger::ERROR, bool $bubble = true)
     {
-        $this->rollbarNotifier = $rollbarNotifier;
+        $this->rollbarLogger = $rollbarLogger;
 
         parent::__construct($level, $bubble);
     }
@@ -75,7 +73,7 @@ class RollbarHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         if (!$this->initialized) {
             // __destructor() doesn't get called on Fatal errors
@@ -84,40 +82,30 @@ class RollbarHandler extends AbstractProcessingHandler
         }
 
         $context = $record['context'];
-        $payload = array();
-        if (isset($context['payload'])) {
-            $payload = $context['payload'];
-            unset($context['payload']);
-        }
-        $context = array_merge($context, $record['extra'], array(
+        $context = array_merge($context, $record['extra'], [
             'level' => $this->levelMap[$record['level']],
             'monolog_level' => $record['level_name'],
             'channel' => $record['channel'],
             'datetime' => $record['datetime']->format('U'),
-        ));
+        ]);
 
-        if (isset($context['exception']) && $context['exception'] instanceof Exception) {
-            $payload['level'] = $context['level'];
+        if (isset($context['exception']) && $context['exception'] instanceof Throwable) {
             $exception = $context['exception'];
             unset($context['exception']);
-
-            $this->rollbarNotifier->report_exception($exception, $context, $payload);
+            $toLog = $exception;
         } else {
-            $this->rollbarNotifier->report_message(
-                $record['message'],
-                $context['level'],
-                $context,
-                $payload
-            );
+            $toLog = $record['message'];
         }
 
+        $this->rollbarLogger->log($context['level'], $toLog, $context);
+
         $this->hasRecords = true;
     }
 
-    public function flush()
+    public function flush(): void
     {
         if ($this->hasRecords) {
-            $this->rollbarNotifier->flush();
+            $this->rollbarLogger->flush();
             $this->hasRecords = false;
         }
     }
@@ -125,7 +113,7 @@ class RollbarHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    public function close()
+    public function close(): void
     {
         $this->flush();
     }
@@ -139,6 +127,4 @@ class RollbarHandler extends AbstractProcessingHandler
 
         parent::reset();
     }
-
-
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php
index ae2309f..c1ff25b 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,6 +11,7 @@
 
 namespace Monolog\Handler;
 
+use InvalidArgumentException;
 use Monolog\Logger;
 
 /**
@@ -24,9 +25,9 @@ use Monolog\Logger;
  */
 class RotatingFileHandler extends StreamHandler
 {
-    const FILE_PER_DAY = 'Y-m-d';
-    const FILE_PER_MONTH = 'Y-m';
-    const FILE_PER_YEAR = 'Y';
+    public const FILE_PER_DAY = 'Y-m-d';
+    public const FILE_PER_MONTH = 'Y-m';
+    public const FILE_PER_YEAR = 'Y';
 
     protected $filename;
     protected $maxFiles;
@@ -36,20 +37,20 @@ class RotatingFileHandler extends StreamHandler
     protected $dateFormat;
 
     /**
-     * @param string   $filename
-     * @param int      $maxFiles       The maximal amount of files to keep (0 means unlimited)
-     * @param int      $level          The minimum logging level at which this handler will be triggered
-     * @param bool     $bubble         Whether the messages that are handled can bubble up the stack or not
-     * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write)
-     * @param bool     $useLocking     Try to lock log file before doing any writes
+     * @param string     $filename
+     * @param int        $maxFiles       The maximal amount of files to keep (0 means unlimited)
+     * @param string|int $level          The minimum logging level at which this handler will be triggered
+     * @param bool       $bubble         Whether the messages that are handled can bubble up the stack or not
+     * @param int|null   $filePermission Optional file permissions (default (0644) are only for owner read/write)
+     * @param bool       $useLocking     Try to lock log file before doing any writes
      */
-    public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false)
+    public function __construct(string $filename, int $maxFiles = 0, $level = Logger::DEBUG, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false)
     {
         $this->filename = $filename;
-        $this->maxFiles = (int) $maxFiles;
-        $this->nextRotation = new \DateTime('tomorrow');
+        $this->maxFiles = $maxFiles;
+        $this->nextRotation = new \DateTimeImmutable('tomorrow');
         $this->filenameFormat = '{filename}-{date}';
-        $this->dateFormat = 'Y-m-d';
+        $this->dateFormat = static::FILE_PER_DAY;
 
         parent::__construct($this->getTimedFilename(), $level, $bubble, $filePermission, $useLocking);
     }
@@ -57,7 +58,7 @@ class RotatingFileHandler extends StreamHandler
     /**
      * {@inheritdoc}
      */
-    public function close()
+    public function close(): void
     {
         parent::close();
 
@@ -78,40 +79,40 @@ class RotatingFileHandler extends StreamHandler
         }
     }
 
-    public function setFilenameFormat($filenameFormat, $dateFormat)
+    public function setFilenameFormat(string $filenameFormat, string $dateFormat): self
     {
-        if (!preg_match('{^Y(([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) {
-            trigger_error(
+        if (!preg_match('{^[Yy](([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) {
+            throw new InvalidArgumentException(
                 'Invalid date format - format must be one of '.
                 'RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), RotatingFileHandler::FILE_PER_MONTH ("Y-m") '.
                 'or RotatingFileHandler::FILE_PER_YEAR ("Y"), or you can set one of the '.
-                'date formats using slashes, underscores and/or dots instead of dashes.',
-                E_USER_DEPRECATED
+                'date formats using slashes, underscores and/or dots instead of dashes.'
             );
         }
         if (substr_count($filenameFormat, '{date}') === 0) {
-            trigger_error(
-                'Invalid filename format - format should contain at least `{date}`, because otherwise rotating is impossible.',
-                E_USER_DEPRECATED
+            throw new InvalidArgumentException(
+                'Invalid filename format - format must contain at least `{date}`, because otherwise rotating is impossible.'
             );
         }
         $this->filenameFormat = $filenameFormat;
         $this->dateFormat = $dateFormat;
         $this->url = $this->getTimedFilename();
         $this->close();
+
+        return $this;
     }
 
     /**
      * {@inheritdoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         // on the first record written, if the log is new, we should rotate (once per day)
         if (null === $this->mustRotate) {
             $this->mustRotate = !file_exists($this->url);
         }
 
-        if ($this->nextRotation < $record['datetime']) {
+        if ($this->nextRotation <= $record['datetime']) {
             $this->mustRotate = true;
             $this->close();
         }
@@ -122,11 +123,11 @@ class RotatingFileHandler extends StreamHandler
     /**
      * Rotates the files.
      */
-    protected function rotate()
+    protected function rotate(): void
     {
         // update filename
         $this->url = $this->getTimedFilename();
-        $this->nextRotation = new \DateTime('tomorrow');
+        $this->nextRotation = new \DateTimeImmutable('tomorrow');
 
         // skip GC of old logs if files are unlimited
         if (0 === $this->maxFiles) {
@@ -148,7 +149,9 @@ class RotatingFileHandler extends StreamHandler
             if (is_writable($file)) {
                 // suppress errors here as unlink() might fail if two processes
                 // are cleaning up/rotating at the same time
-                set_error_handler(function ($errno, $errstr, $errfile, $errline) {});
+                set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline): bool {
+                    return false;
+                });
                 unlink($file);
                 restore_error_handler();
             }
@@ -157,12 +160,12 @@ class RotatingFileHandler extends StreamHandler
         $this->mustRotate = false;
     }
 
-    protected function getTimedFilename()
+    protected function getTimedFilename(): string
     {
         $fileInfo = pathinfo($this->filename);
         $timedFilename = str_replace(
-            array('{filename}', '{date}'),
-            array($fileInfo['filename'], date($this->dateFormat)),
+            ['{filename}', '{date}'],
+            [$fileInfo['filename'], date($this->dateFormat)],
             $fileInfo['dirname'] . '/' . $this->filenameFormat
         );
 
@@ -173,12 +176,12 @@ class RotatingFileHandler extends StreamHandler
         return $timedFilename;
     }
 
-    protected function getGlobPattern()
+    protected function getGlobPattern(): string
     {
         $fileInfo = pathinfo($this->filename);
         $glob = str_replace(
-            array('{filename}', '{date}'),
-            array($fileInfo['filename'], '[0-9][0-9][0-9][0-9]*'),
+            ['{filename}', '{date}'],
+            [$fileInfo['filename'], '[0-9][0-9][0-9][0-9]*'],
             $fileInfo['dirname'] . '/' . $this->filenameFormat
         );
         if (!empty($fileInfo['extension'])) {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php
index 9509ae3..2964787 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,6 +11,8 @@
 
 namespace Monolog\Handler;
 
+use Monolog\Formatter\FormatterInterface;
+
 /**
  * Sampling handler
  *
@@ -25,8 +27,10 @@ namespace Monolog\Handler;
  * @author Bryan Davis <bd808@wikimedia.org>
  * @author Kunal Mehta <legoktm@gmail.com>
  */
-class SamplingHandler extends AbstractHandler
+class SamplingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface
 {
+    use ProcessableHandlerTrait;
+
     /**
      * @var callable|HandlerInterface $handler
      */
@@ -38,10 +42,10 @@ class SamplingHandler extends AbstractHandler
     protected $factor;
 
     /**
-     * @param callable|HandlerInterface $handler Handler or factory callable($record, $fingersCrossedHandler).
-     * @param int                       $factor  Sample factor
+     * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $samplingHandler).
+     * @param int                       $factor  Sample factor (e.g. 10 means every ~10th record is sampled)
      */
-    public function __construct($handler, $factor)
+    public function __construct($handler, int $factor)
     {
         parent::__construct();
         $this->handler = $handler;
@@ -52,31 +56,58 @@ class SamplingHandler extends AbstractHandler
         }
     }
 
-    public function isHandling(array $record)
+    public function isHandling(array $record): bool
     {
-        return $this->handler->isHandling($record);
+        return $this->getHandler($record)->isHandling($record);
     }
 
-    public function handle(array $record)
+    public function handle(array $record): bool
     {
         if ($this->isHandling($record) && mt_rand(1, $this->factor) === 1) {
-            // The same logic as in FingersCrossedHandler
-            if (!$this->handler instanceof HandlerInterface) {
-                $this->handler = call_user_func($this->handler, $record, $this);
-                if (!$this->handler instanceof HandlerInterface) {
-                    throw new \RuntimeException("The factory callable should return a HandlerInterface");
-                }
-            }
-
             if ($this->processors) {
-                foreach ($this->processors as $processor) {
-                    $record = call_user_func($processor, $record);
-                }
+                $record = $this->processRecord($record);
             }
 
-            $this->handler->handle($record);
+            $this->getHandler($record)->handle($record);
         }
 
         return false === $this->bubble;
     }
+
+    /**
+     * Return the nested handler
+     *
+     * If the handler was provided as a factory callable, this will trigger the handler's instantiation.
+     *
+     * @return HandlerInterface
+     */
+    public function getHandler(array $record = null)
+    {
+        if (!$this->handler instanceof HandlerInterface) {
+            $this->handler = call_user_func($this->handler, $record, $this);
+            if (!$this->handler instanceof HandlerInterface) {
+                throw new \RuntimeException("The factory callable should return a HandlerInterface");
+            }
+        }
+
+        return $this->handler;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFormatter(FormatterInterface $formatter): HandlerInterface
+    {
+        $this->getHandler()->setFormatter($formatter);
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFormatter(): FormatterInterface
+    {
+        return $this->getHandler()->getFormatter();
+    }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php b/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php
index e55e0e2..b74a22f 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -12,6 +12,7 @@
 namespace Monolog\Handler\Slack;
 
 use Monolog\Logger;
+use Monolog\Utils;
 use Monolog\Formatter\NormalizerFormatter;
 use Monolog\Formatter\FormatterInterface;
 
@@ -25,13 +26,13 @@ use Monolog\Formatter\FormatterInterface;
  */
 class SlackRecord
 {
-    const COLOR_DANGER = 'danger';
+    public const COLOR_DANGER = 'danger';
 
-    const COLOR_WARNING = 'warning';
+    public const COLOR_WARNING = 'warning';
 
-    const COLOR_GOOD = 'good';
+    public const COLOR_GOOD = 'good';
 
-    const COLOR_DEFAULT = '#e3e4e6';
+    public const COLOR_DEFAULT = '#e3e4e6';
 
     /**
      * Slack channel (encoded ID or name)
@@ -47,7 +48,7 @@ class SlackRecord
 
     /**
      * User icon e.g. 'ghost', 'http://example.com/user.png'
-     * @var string
+     * @var string|null
      */
     private $userIcon;
 
@@ -85,26 +86,39 @@ class SlackRecord
      */
     private $normalizerFormatter;
 
-    public function __construct($channel = null, $username = null, $useAttachment = true, $userIcon = null, $useShortAttachment = false, $includeContextAndExtra = false, array $excludeFields = array(), FormatterInterface $formatter = null)
-    {
-        $this->channel = $channel;
-        $this->username = $username;
-        $this->userIcon = trim($userIcon, ':');
-        $this->useAttachment = $useAttachment;
-        $this->useShortAttachment = $useShortAttachment;
-        $this->includeContextAndExtra = $includeContextAndExtra;
-        $this->excludeFields = $excludeFields;
-        $this->formatter = $formatter;
+    public function __construct(
+        ?string $channel = null,
+        ?string $username = null,
+        bool $useAttachment = true,
+        ?string $userIcon = null,
+        bool $useShortAttachment = false,
+        bool $includeContextAndExtra = false,
+        array $excludeFields = array(),
+        FormatterInterface $formatter = null
+    ) {
+        $this
+            ->setChannel($channel)
+            ->setUsername($username)
+            ->useAttachment($useAttachment)
+            ->setUserIcon($userIcon)
+            ->useShortAttachment($useShortAttachment)
+            ->includeContextAndExtra($includeContextAndExtra)
+            ->excludeFields($excludeFields)
+            ->setFormatter($formatter);
 
         if ($this->includeContextAndExtra) {
             $this->normalizerFormatter = new NormalizerFormatter();
         }
     }
 
-    public function getSlackData(array $record)
+    /**
+     * Returns required data in format that Slack
+     * is expecting.
+     */
+    public function getSlackData(array $record): array
     {
         $dataArray = array();
-        $record = $this->excludeFields($record);
+        $record = $this->removeExcludedFields($record);
 
         if ($this->username) {
             $dataArray['username'] = $this->username;
@@ -127,7 +141,7 @@ class SlackRecord
                 'color'     => $this->getAttachmentColor($record['level']),
                 'fields'    => array(),
                 'mrkdwn_in' => array('fields'),
-                'ts'        => $record['datetime']->getTimestamp()
+                'ts'        => $record['datetime']->getTimestamp(),
             );
 
             if ($this->useShortAttachment) {
@@ -137,7 +151,6 @@ class SlackRecord
                 $attachment['fields'][] = $this->generateAttachmentField('Level', $record['level_name']);
             }
 
-
             if ($this->includeContextAndExtra) {
                 foreach (array('extra', 'context') as $key) {
                     if (empty($record[$key])) {
@@ -146,7 +159,7 @@ class SlackRecord
 
                     if ($this->useShortAttachment) {
                         $attachment['fields'][] = $this->generateAttachmentField(
-                            $key,
+                            (string) $key,
                             $record[$key]
                         );
                     } else {
@@ -176,89 +189,142 @@ class SlackRecord
     }
 
     /**
-     * Returned a Slack message attachment color associated with
+     * Returns a Slack message attachment color associated with
      * provided level.
-     *
-     * @param  int    $level
-     * @return string
      */
-    public function getAttachmentColor($level)
+    public function getAttachmentColor(int $level): string
     {
         switch (true) {
             case $level >= Logger::ERROR:
-                return self::COLOR_DANGER;
+                return static::COLOR_DANGER;
             case $level >= Logger::WARNING:
-                return self::COLOR_WARNING;
+                return static::COLOR_WARNING;
             case $level >= Logger::INFO:
-                return self::COLOR_GOOD;
+                return static::COLOR_GOOD;
             default:
-                return self::COLOR_DEFAULT;
+                return static::COLOR_DEFAULT;
         }
     }
 
     /**
      * Stringifies an array of key/value pairs to be used in attachment fields
-     *
-     * @param array $fields
-     *
-     * @return string
      */
-    public function stringify($fields)
+    public function stringify(array $fields): string
     {
         $normalized = $this->normalizerFormatter->format($fields);
-        $prettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128;
 
         $hasSecondDimension = count(array_filter($normalized, 'is_array'));
         $hasNonNumericKeys = !count(array_filter(array_keys($normalized), 'is_numeric'));
 
         return $hasSecondDimension || $hasNonNumericKeys
-            ? json_encode($normalized, $prettyPrintFlag)
-            : json_encode($normalized);
+            ? Utils::jsonEncode($normalized, JSON_PRETTY_PRINT|Utils::DEFAULT_JSON_FLAGS)
+            : Utils::jsonEncode($normalized, Utils::DEFAULT_JSON_FLAGS);
     }
 
     /**
-     * Sets the formatter
+     * Channel used by the bot when posting
      *
-     * @param FormatterInterface $formatter
+     * @param ?string $channel
+     *
+     * @return SlackHandler
      */
-    public function setFormatter(FormatterInterface $formatter)
+    public function setChannel(?string $channel = null): self
+    {
+        $this->channel = $channel;
+
+        return $this;
+    }
+
+    /**
+     * Username used by the bot when posting
+     *
+     * @param ?string $username
+     *
+     * @return SlackHandler
+     */
+    public function setUsername(?string $username = null): self
+    {
+        $this->username = $username;
+
+        return $this;
+    }
+
+    public function useAttachment(bool $useAttachment = true): self
+    {
+        $this->useAttachment = $useAttachment;
+
+        return $this;
+    }
+
+    public function setUserIcon(?string $userIcon = null): self
+    {
+        $this->userIcon = $userIcon;
+
+        if (\is_string($userIcon)) {
+            $this->userIcon = trim($userIcon, ':');
+        }
+
+        return $this;
+    }
+
+    public function useShortAttachment(bool $useShortAttachment = false): self
+    {
+        $this->useShortAttachment = $useShortAttachment;
+
+        return $this;
+    }
+
+    public function includeContextAndExtra(bool $includeContextAndExtra = false): self
+    {
+        $this->includeContextAndExtra = $includeContextAndExtra;
+
+        if ($this->includeContextAndExtra) {
+            $this->normalizerFormatter = new NormalizerFormatter();
+        }
+
+        return $this;
+    }
+
+    public function excludeFields(array $excludeFields = []): self
+    {
+        $this->excludeFields = $excludeFields;
+
+        return $this;
+    }
+
+    public function setFormatter(?FormatterInterface $formatter = null): self
     {
         $this->formatter = $formatter;
+
+        return $this;
     }
 
     /**
      * Generates attachment field
      *
-     * @param string       $title
      * @param string|array $value
-     *
-     * @return array
      */
-    private function generateAttachmentField($title, $value)
+    private function generateAttachmentField(string $title, $value): array
     {
         $value = is_array($value)
-            ? sprintf('```%s```', $this->stringify($value))
+            ? sprintf('```%s```', substr($this->stringify($value), 0, 1990))
             : $value;
 
         return array(
             'title' => ucfirst($title),
             'value' => $value,
-            'short' => false
+            'short' => false,
         );
     }
 
     /**
      * Generates a collection of attachment fields from array
-     *
-     * @param array $data
-     *
-     * @return array
      */
-    private function generateAttachmentFields(array $data)
+    private function generateAttachmentFields(array $data): array
     {
         $fields = array();
         foreach ($this->normalizerFormatter->format($data) as $key => $value) {
-            $fields[] = $this->generateAttachmentField($key, $value);
+            $fields[] = $this->generateAttachmentField((string) $key, $value);
         }
 
         return $fields;
@@ -266,12 +332,8 @@ class SlackRecord
 
     /**
      * Get a copy of record with fields excluded according to $this->excludeFields
-     *
-     * @param array $record
-     *
-     * @return array
      */
-    private function excludeFields(array $record)
+    private function removeExcludedFields(array $record): array
     {
         foreach ($this->excludeFields as $field) {
             $keys = explode('.', $field);
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php
index 45d634f..c2b93e6 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -13,6 +13,7 @@ namespace Monolog\Handler;
 
 use Monolog\Formatter\FormatterInterface;
 use Monolog\Logger;
+use Monolog\Utils;
 use Monolog\Handler\Slack\SlackRecord;
 
 /**
@@ -48,8 +49,18 @@ class SlackHandler extends SocketHandler
      * @param  array                     $excludeFields          Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2']
      * @throws MissingExtensionException If no OpenSSL PHP extension configured
      */
-    public function __construct($token, $channel, $username = null, $useAttachment = true, $iconEmoji = null, $level = Logger::CRITICAL, $bubble = true, $useShortAttachment = false, $includeContextAndExtra = false, array $excludeFields = array())
-    {
+    public function __construct(
+        string $token,
+        string $channel,
+        ?string $username = null,
+        bool $useAttachment = true,
+        ?string $iconEmoji = null,
+        $level = Logger::CRITICAL,
+        bool $bubble = true,
+        bool $useShortAttachment = false,
+        bool $includeContextAndExtra = false,
+        array $excludeFields = array()
+    ) {
         if (!extension_loaded('openssl')) {
             throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler');
         }
@@ -63,30 +74,26 @@ class SlackHandler extends SocketHandler
             $iconEmoji,
             $useShortAttachment,
             $includeContextAndExtra,
-            $excludeFields,
-            $this->formatter
+            $excludeFields
         );
 
         $this->token = $token;
     }
 
-    public function getSlackRecord()
+    public function getSlackRecord(): SlackRecord
     {
         return $this->slackRecord;
     }
 
-    public function getToken()
+    public function getToken(): string
     {
         return $this->token;
     }
 
     /**
      * {@inheritdoc}
-     *
-     * @param  array  $record
-     * @return string
      */
-    protected function generateDataStream($record)
+    protected function generateDataStream(array $record): string
     {
         $content = $this->buildContent($record);
 
@@ -95,30 +102,21 @@ class SlackHandler extends SocketHandler
 
     /**
      * Builds the body of API call
-     *
-     * @param  array  $record
-     * @return string
      */
-    private function buildContent($record)
+    private function buildContent(array $record): string
     {
         $dataArray = $this->prepareContentData($record);
 
         return http_build_query($dataArray);
     }
 
-    /**
-     * Prepares content data
-     *
-     * @param  array $record
-     * @return array
-     */
-    protected function prepareContentData($record)
+    protected function prepareContentData(array $record): array
     {
         $dataArray = $this->slackRecord->getSlackData($record);
         $dataArray['token'] = $this->token;
 
         if (!empty($dataArray['attachments'])) {
-            $dataArray['attachments'] = json_encode($dataArray['attachments']);
+            $dataArray['attachments'] = Utils::jsonEncode($dataArray['attachments']);
         }
 
         return $dataArray;
@@ -126,11 +124,8 @@ class SlackHandler extends SocketHandler
 
     /**
      * Builds the header of the API Call
-     *
-     * @param  string $content
-     * @return string
      */
-    private function buildHeader($content)
+    private function buildHeader(string $content): string
     {
         $header = "POST /api/chat.postMessage HTTP/1.1\r\n";
         $header .= "Host: slack.com\r\n";
@@ -143,10 +138,8 @@ class SlackHandler extends SocketHandler
 
     /**
      * {@inheritdoc}
-     *
-     * @param array $record
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         parent::write($record);
         $this->finalizeWrite();
@@ -158,7 +151,7 @@ class SlackHandler extends SocketHandler
      * If we do not read some but close the socket too early, slack sometimes
      * drops the request entirely.
      */
-    protected function finalizeWrite()
+    protected function finalizeWrite(): void
     {
         $res = $this->getResource();
         if (is_resource($res)) {
@@ -167,54 +160,74 @@ class SlackHandler extends SocketHandler
         $this->closeSocket();
     }
 
+    public function setFormatter(FormatterInterface $formatter): HandlerInterface
+    {
+        parent::setFormatter($formatter);
+        $this->slackRecord->setFormatter($formatter);
+
+        return $this;
+    }
+
+    public function getFormatter(): FormatterInterface
+    {
+        $formatter = parent::getFormatter();
+        $this->slackRecord->setFormatter($formatter);
+
+        return $formatter;
+    }
+
     /**
-     * Returned a Slack message attachment color associated with
-     * provided level.
-     *
-     * @param  int    $level
-     * @return string
-     * @deprecated Use underlying SlackRecord instead
+     * Channel used by the bot when posting
      */
-    protected function getAttachmentColor($level)
+    public function setChannel(string $channel): self
     {
-        trigger_error(
-            'SlackHandler::getAttachmentColor() is deprecated. Use underlying SlackRecord instead.',
-            E_USER_DEPRECATED
-        );
+        $this->slackRecord->setChannel($channel);
 
-        return $this->slackRecord->getAttachmentColor($level);
+        return $this;
     }
 
     /**
-     * Stringifies an array of key/value pairs to be used in attachment fields
-     *
-     * @param  array  $fields
-     * @return string
-     * @deprecated Use underlying SlackRecord instead
+     * Username used by the bot when posting
      */
-    protected function stringify($fields)
+    public function setUsername(string $username): self
     {
-        trigger_error(
-            'SlackHandler::stringify() is deprecated. Use underlying SlackRecord instead.',
-            E_USER_DEPRECATED
-        );
+        $this->slackRecord->setUsername($username);
 
-        return $this->slackRecord->stringify($fields);
+        return $this;
     }
 
-    public function setFormatter(FormatterInterface $formatter)
+    public function useAttachment(bool $useAttachment): self
     {
-        parent::setFormatter($formatter);
-        $this->slackRecord->setFormatter($formatter);
+        $this->slackRecord->useAttachment($useAttachment);
 
         return $this;
     }
 
-    public function getFormatter()
+    public function setIconEmoji(string $iconEmoji): self
     {
-        $formatter = parent::getFormatter();
-        $this->slackRecord->setFormatter($formatter);
+        $this->slackRecord->setUserIcon($iconEmoji);
 
-        return $formatter;
+        return $this;
+    }
+
+    public function useShortAttachment(bool $useShortAttachment): self
+    {
+        $this->slackRecord->useShortAttachment($useShortAttachment);
+
+        return $this;
+    }
+
+    public function includeContextAndExtra(bool $includeContextAndExtra): self
+    {
+        $this->slackRecord->includeContextAndExtra($includeContextAndExtra);
+
+        return $this;
+    }
+
+    public function excludeFields(array $excludeFields): self
+    {
+        $this->slackRecord->excludeFields($excludeFields);
+
+        return $this;
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php
index 1ef85fa..17d12b0 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -13,6 +13,7 @@ namespace Monolog\Handler;
 
 use Monolog\Formatter\FormatterInterface;
 use Monolog\Logger;
+use Monolog\Utils;
 use Monolog\Handler\Slack\SlackRecord;
 
 /**
@@ -36,19 +37,29 @@ class SlackWebhookHandler extends AbstractProcessingHandler
     private $slackRecord;
 
     /**
-     * @param  string      $webhookUrl             Slack Webhook URL
-     * @param  string|null $channel                Slack channel (encoded ID or name)
-     * @param  string|null $username               Name of a bot
-     * @param  bool        $useAttachment          Whether the message should be added to Slack as attachment (plain text otherwise)
-     * @param  string|null $iconEmoji              The emoji name to use (or null)
-     * @param  bool        $useShortAttachment     Whether the the context/extra messages added to Slack as attachments are in a short style
-     * @param  bool        $includeContextAndExtra Whether the attachment should include context and extra data
-     * @param  int         $level                  The minimum logging level at which this handler will be triggered
-     * @param  bool        $bubble                 Whether the messages that are handled can bubble up the stack or not
-     * @param  array       $excludeFields          Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2']
+     * @param string      $webhookUrl             Slack Webhook URL
+     * @param string|null $channel                Slack channel (encoded ID or name)
+     * @param string|null $username               Name of a bot
+     * @param bool        $useAttachment          Whether the message should be added to Slack as attachment (plain text otherwise)
+     * @param string|null $iconEmoji              The emoji name to use (or null)
+     * @param bool        $useShortAttachment     Whether the the context/extra messages added to Slack as attachments are in a short style
+     * @param bool        $includeContextAndExtra Whether the attachment should include context and extra data
+     * @param string|int  $level                  The minimum logging level at which this handler will be triggered
+     * @param bool        $bubble                 Whether the messages that are handled can bubble up the stack or not
+     * @param array       $excludeFields          Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2']
      */
-    public function __construct($webhookUrl, $channel = null, $username = null, $useAttachment = true, $iconEmoji = null, $useShortAttachment = false, $includeContextAndExtra = false, $level = Logger::CRITICAL, $bubble = true, array $excludeFields = array())
-    {
+    public function __construct(
+        string $webhookUrl,
+        ?string $channel = null,
+        ?string $username = null,
+        bool $useAttachment = true,
+        ?string $iconEmoji = null,
+        bool $useShortAttachment = false,
+        bool $includeContextAndExtra = false,
+        $level = Logger::CRITICAL,
+        bool $bubble = true,
+        array $excludeFields = array()
+    ) {
         parent::__construct($level, $bubble);
 
         $this->webhookUrl = $webhookUrl;
@@ -60,17 +71,16 @@ class SlackWebhookHandler extends AbstractProcessingHandler
             $iconEmoji,
             $useShortAttachment,
             $includeContextAndExtra,
-            $excludeFields,
-            $this->formatter
+            $excludeFields
         );
     }
 
-    public function getSlackRecord()
+    public function getSlackRecord(): SlackRecord
     {
         return $this->slackRecord;
     }
 
-    public function getWebhookUrl()
+    public function getWebhookUrl(): string
     {
         return $this->webhookUrl;
     }
@@ -80,10 +90,10 @@ class SlackWebhookHandler extends AbstractProcessingHandler
      *
      * @param array $record
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         $postData = $this->slackRecord->getSlackData($record);
-        $postString = json_encode($postData);
+        $postString = Utils::jsonEncode($postData);
 
         $ch = curl_init();
         $options = array(
@@ -91,7 +101,7 @@ class SlackWebhookHandler extends AbstractProcessingHandler
             CURLOPT_POST => true,
             CURLOPT_RETURNTRANSFER => true,
             CURLOPT_HTTPHEADER => array('Content-type: application/json'),
-            CURLOPT_POSTFIELDS => $postString
+            CURLOPT_POSTFIELDS => $postString,
         );
         if (defined('CURLOPT_SAFE_UPLOAD')) {
             $options[CURLOPT_SAFE_UPLOAD] = true;
@@ -102,7 +112,7 @@ class SlackWebhookHandler extends AbstractProcessingHandler
         Curl\Util::execute($ch);
     }
 
-    public function setFormatter(FormatterInterface $formatter)
+    public function setFormatter(FormatterInterface $formatter): HandlerInterface
     {
         parent::setFormatter($formatter);
         $this->slackRecord->setFormatter($formatter);
@@ -110,7 +120,7 @@ class SlackWebhookHandler extends AbstractProcessingHandler
         return $this;
     }
 
-    public function getFormatter()
+    public function getFormatter(): FormatterInterface
     {
         $formatter = parent::getFormatter();
         $this->slackRecord->setFormatter($formatter);
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php
deleted file mode 100644
index baead52..0000000
--- a/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\Logger;
-
-/**
- * Sends notifications through Slack's Slackbot
- *
- * @author Haralan Dobrev <hkdobrev@gmail.com>
- * @see    https://slack.com/apps/A0F81R8ET-slackbot
- */
-class SlackbotHandler extends AbstractProcessingHandler
-{
-    /**
-     * The slug of the Slack team
-     * @var string
-     */
-    private $slackTeam;
-
-    /**
-     * Slackbot token
-     * @var string
-     */
-    private $token;
-
-    /**
-     * Slack channel name
-     * @var string
-     */
-    private $channel;
-
-    /**
-     * @param  string $slackTeam Slack team slug
-     * @param  string $token     Slackbot token
-     * @param  string $channel   Slack channel (encoded ID or name)
-     * @param  int    $level     The minimum logging level at which this handler will be triggered
-     * @param  bool   $bubble    Whether the messages that are handled can bubble up the stack or not
-     */
-    public function __construct($slackTeam, $token, $channel, $level = Logger::CRITICAL, $bubble = true)
-    {
-        parent::__construct($level, $bubble);
-
-        $this->slackTeam = $slackTeam;
-        $this->token = $token;
-        $this->channel = $channel;
-    }
-
-    /**
-     * {@inheritdoc}
-     *
-     * @param array $record
-     */
-    protected function write(array $record)
-    {
-        $slackbotUrl = sprintf(
-            'https://%s.slack.com/services/hooks/slackbot?token=%s&channel=%s',
-            $this->slackTeam,
-            $this->token,
-            $this->channel
-        );
-
-        $ch = curl_init();
-        curl_setopt($ch, CURLOPT_URL, $slackbotUrl);
-        curl_setopt($ch, CURLOPT_POST, true);
-        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-        curl_setopt($ch, CURLOPT_POSTFIELDS, $record['message']);
-
-        Curl\Util::execute($ch);
-    }
-}
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php
index db50d97..2861e67 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -23,10 +23,14 @@ class SocketHandler extends AbstractProcessingHandler
 {
     private $connectionString;
     private $connectionTimeout;
+    /** @var resource|null */
     private $resource;
+    /** @var float */
     private $timeout = 0;
+    /** @var float */
     private $writingTimeout = 10;
     private $lastSentBytes = null;
+    /** @var int */
     private $chunkSize = null;
     private $persistent = false;
     private $errno;
@@ -34,11 +38,11 @@ class SocketHandler extends AbstractProcessingHandler
     private $lastWritingAt;
 
     /**
-     * @param string $connectionString Socket connection string
-     * @param int    $level            The minimum logging level at which this handler will be triggered
-     * @param bool   $bubble           Whether the messages that are handled can bubble up the stack or not
+     * @param string     $connectionString Socket connection string
+     * @param int|string $level            The minimum logging level at which this handler will be triggered
+     * @param bool       $bubble           Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct($connectionString, $level = Logger::DEBUG, $bubble = true)
+    public function __construct(string $connectionString, $level = Logger::DEBUG, bool $bubble = true)
     {
         parent::__construct($level, $bubble);
         $this->connectionString = $connectionString;
@@ -53,7 +57,7 @@ class SocketHandler extends AbstractProcessingHandler
      * @throws \UnexpectedValueException
      * @throws \RuntimeException
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         $this->connectIfNotConnected();
         $data = $this->generateDataStream($record);
@@ -63,7 +67,7 @@ class SocketHandler extends AbstractProcessingHandler
     /**
      * We will not close a PersistentSocket instance so it can be reused in other requests.
      */
-    public function close()
+    public function close(): void
     {
         if (!$this->isPersistent()) {
             $this->closeSocket();
@@ -73,7 +77,7 @@ class SocketHandler extends AbstractProcessingHandler
     /**
      * Close socket, if open
      */
-    public function closeSocket()
+    public function closeSocket(): void
     {
         if (is_resource($this->resource)) {
             fclose($this->resource);
@@ -82,39 +86,39 @@ class SocketHandler extends AbstractProcessingHandler
     }
 
     /**
-     * Set socket connection to nbe persistent. It only has effect before the connection is initiated.
-     *
-     * @param bool $persistent
+     * Set socket connection to be persistent. It only has effect before the connection is initiated.
      */
-    public function setPersistent($persistent)
+    public function setPersistent(bool $persistent): self
     {
-        $this->persistent = (bool) $persistent;
+        $this->persistent = $persistent;
+
+        return $this;
     }
 
     /**
      * Set connection timeout.  Only has effect before we connect.
      *
-     * @param float $seconds
-     *
      * @see http://php.net/manual/en/function.fsockopen.php
      */
-    public function setConnectionTimeout($seconds)
+    public function setConnectionTimeout(float $seconds): self
     {
         $this->validateTimeout($seconds);
-        $this->connectionTimeout = (float) $seconds;
+        $this->connectionTimeout = $seconds;
+
+        return $this;
     }
 
     /**
      * Set write timeout. Only has effect before we connect.
      *
-     * @param float $seconds
-     *
      * @see http://php.net/manual/en/function.stream-set-timeout.php
      */
-    public function setTimeout($seconds)
+    public function setTimeout(float $seconds): self
     {
         $this->validateTimeout($seconds);
-        $this->timeout = (float) $seconds;
+        $this->timeout = $seconds;
+
+        return $this;
     }
 
     /**
@@ -122,58 +126,52 @@ class SocketHandler extends AbstractProcessingHandler
      *
      * @param float $seconds 0 for no timeout
      */
-    public function setWritingTimeout($seconds)
+    public function setWritingTimeout(float $seconds): self
     {
         $this->validateTimeout($seconds);
-        $this->writingTimeout = (float) $seconds;
+        $this->writingTimeout = $seconds;
+
+        return $this;
     }
 
     /**
      * Set chunk size. Only has effect during connection in the writing cycle.
-     *
-     * @param float $bytes
      */
-    public function setChunkSize($bytes)
+    public function setChunkSize(int $bytes): self
     {
         $this->chunkSize = $bytes;
+
+        return $this;
     }
 
     /**
      * Get current connection string
-     *
-     * @return string
      */
-    public function getConnectionString()
+    public function getConnectionString(): string
     {
         return $this->connectionString;
     }
 
     /**
      * Get persistent setting
-     *
-     * @return bool
      */
-    public function isPersistent()
+    public function isPersistent(): bool
     {
         return $this->persistent;
     }
 
     /**
      * Get current connection timeout setting
-     *
-     * @return float
      */
-    public function getConnectionTimeout()
+    public function getConnectionTimeout(): float
     {
         return $this->connectionTimeout;
     }
 
     /**
      * Get current in-transfer timeout
-     *
-     * @return float
      */
-    public function getTimeout()
+    public function getTimeout(): float
     {
         return $this->timeout;
     }
@@ -183,17 +181,15 @@ class SocketHandler extends AbstractProcessingHandler
      *
      * @return float
      */
-    public function getWritingTimeout()
+    public function getWritingTimeout(): float
     {
         return $this->writingTimeout;
     }
 
     /**
      * Get current chunk size
-     *
-     * @return float
      */
-    public function getChunkSize()
+    public function getChunkSize(): int
     {
         return $this->chunkSize;
     }
@@ -202,10 +198,8 @@ class SocketHandler extends AbstractProcessingHandler
      * Check to see if the socket is currently available.
      *
      * UDP might appear to be connected but might fail when writing.  See http://php.net/fsockopen for details.
-     *
-     * @return bool
      */
-    public function isConnected()
+    public function isConnected(): bool
     {
         return is_resource($this->resource)
             && !feof($this->resource);  // on TCP - other party can close connection.
@@ -237,7 +231,7 @@ class SocketHandler extends AbstractProcessingHandler
         $seconds = floor($this->timeout);
         $microseconds = round(($this->timeout - $seconds) * 1e6);
 
-        return stream_set_timeout($this->resource, $seconds, $microseconds);
+        return stream_set_timeout($this->resource, (int) $seconds, (int) $microseconds);
     }
 
     /**
@@ -282,7 +276,7 @@ class SocketHandler extends AbstractProcessingHandler
         $this->connect();
     }
 
-    protected function generateDataStream($record)
+    protected function generateDataStream(array $record): string
     {
         return (string) $record['formatted'];
     }
@@ -295,14 +289,14 @@ class SocketHandler extends AbstractProcessingHandler
         return $this->resource;
     }
 
-    private function connect()
+    private function connect(): void
     {
         $this->createSocketResource();
         $this->setSocketTimeout();
         $this->setStreamChunkSize();
     }
 
-    private function createSocketResource()
+    private function createSocketResource(): void
     {
         if ($this->isPersistent()) {
             $resource = $this->pfsockopen();
@@ -315,21 +309,21 @@ class SocketHandler extends AbstractProcessingHandler
         $this->resource = $resource;
     }
 
-    private function setSocketTimeout()
+    private function setSocketTimeout(): void
     {
         if (!$this->streamSetTimeout()) {
             throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()");
         }
     }
 
-    private function setStreamChunkSize()
+    private function setStreamChunkSize(): void
     {
         if ($this->chunkSize && !$this->streamSetChunkSize()) {
             throw new \UnexpectedValueException("Failed setting chunk size with stream_set_chunk_size()");
         }
     }
 
-    private function writeToSocket($data)
+    private function writeToSocket(string $data): void
     {
         $length = strlen($data);
         $sent = 0;
@@ -358,7 +352,7 @@ class SocketHandler extends AbstractProcessingHandler
         }
     }
 
-    private function writingIsTimedOut($sent)
+    private function writingIsTimedOut(int $sent): bool
     {
         $writingTimeout = (int) floor($this->writingTimeout);
         if (0 === $writingTimeout) {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
index a35b7e4..0c2f8d1 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -22,8 +22,10 @@ use Monolog\Logger;
  */
 class StreamHandler extends AbstractProcessingHandler
 {
+    /** @var resource|null */
     protected $stream;
     protected $url;
+    /** @var string|null */
     private $errorMessage;
     protected $filePermission;
     protected $useLocking;
@@ -31,7 +33,7 @@ class StreamHandler extends AbstractProcessingHandler
 
     /**
      * @param resource|string $stream
-     * @param int             $level          The minimum logging level at which this handler will be triggered
+     * @param string|int      $level          The minimum logging level at which this handler will be triggered
      * @param bool            $bubble         Whether the messages that are handled can bubble up the stack or not
      * @param int|null        $filePermission Optional file permissions (default (0644) are only for owner read/write)
      * @param bool            $useLocking     Try to lock log file before doing any writes
@@ -39,7 +41,7 @@ class StreamHandler extends AbstractProcessingHandler
      * @throws \Exception                If a missing directory is not buildable
      * @throws \InvalidArgumentException If stream is not a resource or string
      */
-    public function __construct($stream, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false)
+    public function __construct($stream, $level = Logger::DEBUG, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false)
     {
         parent::__construct($level, $bubble);
         if (is_resource($stream)) {
@@ -57,12 +59,13 @@ class StreamHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    public function close()
+    public function close(): void
     {
         if ($this->url && is_resource($this->stream)) {
             fclose($this->stream);
         }
         $this->stream = null;
+        $this->dirCreated = null;
     }
 
     /**
@@ -80,7 +83,7 @@ class StreamHandler extends AbstractProcessingHandler
      *
      * @return string|null
      */
-    public function getUrl()
+    public function getUrl(): ?string
     {
         return $this->url;
     }
@@ -88,7 +91,7 @@ class StreamHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         if (!is_resource($this->stream)) {
             if (null === $this->url || '' === $this->url) {
@@ -96,7 +99,7 @@ class StreamHandler extends AbstractProcessingHandler
             }
             $this->createDir();
             $this->errorMessage = null;
-            set_error_handler(array($this, 'customErrorHandler'));
+            set_error_handler([$this, 'customErrorHandler']);
             $this->stream = fopen($this->url, 'a');
             if ($this->filePermission !== null) {
                 @chmod($this->url, $this->filePermission);
@@ -104,6 +107,7 @@ class StreamHandler extends AbstractProcessingHandler
             restore_error_handler();
             if (!is_resource($this->stream)) {
                 $this->stream = null;
+
                 throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened: '.$this->errorMessage, $this->url));
             }
         }
@@ -123,24 +127,21 @@ class StreamHandler extends AbstractProcessingHandler
     /**
      * Write to stream
      * @param resource $stream
-     * @param array $record
+     * @param array    $record
      */
-    protected function streamWrite($stream, array $record)
+    protected function streamWrite($stream, array $record): void
     {
         fwrite($stream, (string) $record['formatted']);
     }
 
-    private function customErrorHandler($code, $msg)
+    private function customErrorHandler($code, $msg): bool
     {
         $this->errorMessage = preg_replace('{^(fopen|mkdir)\(.*?\): }', '', $msg);
+
+        return true;
     }
 
-    /**
-     * @param string $stream
-     *
-     * @return null|string
-     */
-    private function getDirFromStream($stream)
+    private function getDirFromStream(string $stream): ?string
     {
         $pos = strpos($stream, '://');
         if ($pos === false) {
@@ -151,10 +152,10 @@ class StreamHandler extends AbstractProcessingHandler
             return dirname(substr($stream, 7));
         }
 
-        return;
+        return null;
     }
 
-    private function createDir()
+    private function createDir(): void
     {
         // Do not try to create dir if it has already been tried.
         if ($this->dirCreated) {
@@ -164,7 +165,7 @@ class StreamHandler extends AbstractProcessingHandler
         $dir = $this->getDirFromStream($this->url);
         if (null !== $dir && !is_dir($dir)) {
             $this->errorMessage = null;
-            set_error_handler(array($this, 'customErrorHandler'));
+            set_error_handler([$this, 'customErrorHandler']);
             $status = mkdir($dir, 0777, true);
             restore_error_handler();
             if (false === $status && !is_dir($dir)) {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php
index ac7b16f..88279d1 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -14,6 +14,7 @@ namespace Monolog\Handler;
 use Monolog\Logger;
 use Monolog\Formatter\FormatterInterface;
 use Monolog\Formatter\LineFormatter;
+use Swift_Message;
 use Swift;
 
 /**
@@ -27,12 +28,12 @@ class SwiftMailerHandler extends MailHandler
     private $messageTemplate;
 
     /**
-     * @param \Swift_Mailer           $mailer  The mailer to use
-     * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced
-     * @param int                     $level   The minimum logging level at which this handler will be triggered
-     * @param bool                    $bubble  Whether the messages that are handled can bubble up the stack or not
+     * @param \Swift_Mailer          $mailer  The mailer to use
+     * @param callable|Swift_Message $message An example message for real messages, only the body will be replaced
+     * @param string|int             $level   The minimum logging level at which this handler will be triggered
+     * @param bool                   $bubble  Whether the messages that are handled can bubble up the stack or not
      */
-    public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = true)
+    public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, bool $bubble = true)
     {
         parent::__construct($level, $bubble);
 
@@ -43,7 +44,7 @@ class SwiftMailerHandler extends MailHandler
     /**
      * {@inheritdoc}
      */
-    protected function send($content, array $records)
+    protected function send(string $content, array $records): void
     {
         $this->mailer->send($this->buildMessage($content, $records));
     }
@@ -51,10 +52,9 @@ class SwiftMailerHandler extends MailHandler
     /**
      * Gets the formatter for the Swift_Message subject.
      *
-     * @param  string             $format The format of the subject
-     * @return FormatterInterface
+     * @param string $format The format of the subject
      */
-    protected function getSubjectFormatter($format)
+    protected function getSubjectFormatter(string $format): FormatterInterface
     {
         return new LineFormatter($format);
     }
@@ -62,21 +62,21 @@ class SwiftMailerHandler extends MailHandler
     /**
      * Creates instance of Swift_Message to be sent
      *
-     * @param  string         $content formatted email body to be sent
-     * @param  array          $records Log records that formed the content
-     * @return \Swift_Message
+     * @param  string        $content formatted email body to be sent
+     * @param  array         $records Log records that formed the content
+     * @return Swift_Message
      */
-    protected function buildMessage($content, array $records)
+    protected function buildMessage(string $content, array $records): Swift_Message
     {
         $message = null;
-        if ($this->messageTemplate instanceof \Swift_Message) {
+        if ($this->messageTemplate instanceof Swift_Message) {
             $message = clone $this->messageTemplate;
             $message->generateId();
         } elseif (is_callable($this->messageTemplate)) {
             $message = call_user_func($this->messageTemplate, $content, $records);
         }
 
-        if (!$message instanceof \Swift_Message) {
+        if (!$message instanceof Swift_Message) {
             throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it');
         }
 
@@ -85,7 +85,12 @@ class SwiftMailerHandler extends MailHandler
             $message->setSubject($subjectFormatter->format($this->getHighestRecord($records)));
         }
 
-        $message->setBody($content);
+        $mime = 'text/plain';
+        if ($this->isHtmlBody($content)) {
+            $mime = 'text/html';
+        }
+
+        $message->setBody($content, $mime);
         if (version_compare(Swift::VERSION, '6.0.0', '>=')) {
             $message->setDate(new \DateTimeImmutable());
         } else {
@@ -94,18 +99,4 @@ class SwiftMailerHandler extends MailHandler
 
         return $message;
     }
-
-    /**
-     * BC getter, to be removed in 2.0
-     */
-    public function __get($name)
-    {
-        if ($name === 'message') {
-            trigger_error('SwiftMailerHandler->message is deprecated, use ->buildMessage() instead to retrieve the message', E_USER_DEPRECATED);
-
-            return $this->buildMessage(null, array());
-        }
-
-        throw new \InvalidArgumentException('Invalid property '.$name);
-    }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php
index f770c80..20594ce 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -32,13 +32,13 @@ class SyslogHandler extends AbstractSyslogHandler
     protected $logopts;
 
     /**
-     * @param string $ident
-     * @param mixed  $facility
-     * @param int    $level    The minimum logging level at which this handler will be triggered
-     * @param bool   $bubble   Whether the messages that are handled can bubble up the stack or not
-     * @param int    $logopts  Option flags for the openlog() call, defaults to LOG_PID
+     * @param string     $ident
+     * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant
+     * @param string|int $level    The minimum logging level at which this handler will be triggered
+     * @param bool       $bubble   Whether the messages that are handled can bubble up the stack or not
+     * @param int        $logopts  Option flags for the openlog() call, defaults to LOG_PID
      */
-    public function __construct($ident, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $logopts = LOG_PID)
+    public function __construct(string $ident, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, int $logopts = LOG_PID)
     {
         parent::__construct($facility, $level, $bubble);
 
@@ -49,7 +49,7 @@ class SyslogHandler extends AbstractSyslogHandler
     /**
      * {@inheritdoc}
      */
-    public function close()
+    public function close(): void
     {
         closelog();
     }
@@ -57,7 +57,7 @@ class SyslogHandler extends AbstractSyslogHandler
     /**
      * {@inheritdoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         if (!openlog($this->ident, $this->logopts, $this->facility)) {
             throw new \LogicException('Can\'t open syslog for ident "'.$this->ident.'" and facility "'.$this->facility.'"');
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php
index 3bff085..c43bc15 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,15 +11,20 @@
 
 namespace Monolog\Handler\SyslogUdp;
 
+use Monolog\Utils;
+
 class UdpSocket
 {
-    const DATAGRAM_MAX_LENGTH = 65023;
+    protected const DATAGRAM_MAX_LENGTH = 65023;
 
+    /** @var string */
     protected $ip;
+    /** @var int */
     protected $port;
+    /** @var resource|null */
     protected $socket;
 
-    public function __construct($ip, $port = 514)
+    public function __construct(string $ip, int $port = 514)
     {
         $this->ip = $ip;
         $this->port = $port;
@@ -31,7 +36,7 @@ class UdpSocket
         $this->send($this->assembleMessage($line, $header));
     }
 
-    public function close()
+    public function close(): void
     {
         if (is_resource($this->socket)) {
             socket_close($this->socket);
@@ -39,18 +44,18 @@ class UdpSocket
         }
     }
 
-    protected function send($chunk)
+    protected function send(string $chunk): void
     {
         if (!is_resource($this->socket)) {
-            throw new \LogicException('The UdpSocket to '.$this->ip.':'.$this->port.' has been closed and can not be written to anymore');
+            throw new \RuntimeException('The UdpSocket to '.$this->ip.':'.$this->port.' has been closed and can not be written to anymore');
         }
         socket_sendto($this->socket, $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port);
     }
 
-    protected function assembleMessage($line, $header)
+    protected function assembleMessage(string $line, string $header): string
     {
-        $chunkSize = self::DATAGRAM_MAX_LENGTH - strlen($header);
+        $chunkSize = static::DATAGRAM_MAX_LENGTH - strlen($header);
 
-        return $header . substr($line, 0, $chunkSize);
+        return $header . Utils::substr($line, 0, $chunkSize);
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php
index e14b378..c85ef5b 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,6 +11,7 @@
 
 namespace Monolog\Handler;
 
+use DateTimeInterface;
 use Monolog\Logger;
 use Monolog\Handler\SyslogUdp\UdpSocket;
 
@@ -18,58 +19,70 @@ use Monolog\Handler\SyslogUdp\UdpSocket;
  * A Handler for logging to a remote syslogd server.
  *
  * @author Jesper Skovgaard Nielsen <nulpunkt@gmail.com>
+ * @author Dominik Kukacka <dominik.kukacka@gmail.com>
  */
 class SyslogUdpHandler extends AbstractSyslogHandler
 {
+    const RFC3164 = 0;
+    const RFC5424 = 1;
+
+    private $dateFormats = array(
+        self::RFC3164 => 'M d H:i:s',
+        self::RFC5424 => \DateTime::RFC3339,
+    );
+
     protected $socket;
     protected $ident;
+    protected $rfc;
 
     /**
-     * @param string $host
-     * @param int    $port
-     * @param mixed  $facility
-     * @param int    $level    The minimum logging level at which this handler will be triggered
-     * @param bool   $bubble   Whether the messages that are handled can bubble up the stack or not
-     * @param string $ident    Program name or tag for each log message.
+     * @param string     $host
+     * @param int        $port
+     * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant
+     * @param string|int $level    The minimum logging level at which this handler will be triggered
+     * @param bool       $bubble   Whether the messages that are handled can bubble up the stack or not
+     * @param string     $ident    Program name or tag for each log message.
+     * @param int        $rfc      RFC to format the message for.
      */
-    public function __construct($host, $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $ident = 'php')
+    public function __construct(string $host, int $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, string $ident = 'php', int $rfc = self::RFC5424)
     {
         parent::__construct($facility, $level, $bubble);
 
         $this->ident = $ident;
+        $this->rfc = $rfc;
 
         $this->socket = new UdpSocket($host, $port ?: 514);
     }
 
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         $lines = $this->splitMessageIntoLines($record['formatted']);
 
-        $header = $this->makeCommonSyslogHeader($this->logLevels[$record['level']]);
+        $header = $this->makeCommonSyslogHeader($this->logLevels[$record['level']], $record['datetime']);
 
         foreach ($lines as $line) {
             $this->socket->write($line, $header);
         }
     }
 
-    public function close()
+    public function close(): void
     {
         $this->socket->close();
     }
 
-    private function splitMessageIntoLines($message)
+    private function splitMessageIntoLines($message): array
     {
         if (is_array($message)) {
             $message = implode("\n", $message);
         }
 
-        return preg_split('/$\R?^/m', $message, -1, PREG_SPLIT_NO_EMPTY);
+        return preg_split('/$\R?^/m', (string) $message, -1, PREG_SPLIT_NO_EMPTY);
     }
 
     /**
-     * Make common syslog header (see rfc5424)
+     * Make common syslog header (see rfc5424 or rfc3164)
      */
-    protected function makeCommonSyslogHeader($severity)
+    protected function makeCommonSyslogHeader(int $severity, DateTimeInterface $datetime): string
     {
         $priority = $severity + $this->facility;
 
@@ -81,23 +94,32 @@ class SyslogUdpHandler extends AbstractSyslogHandler
             $hostname = '-';
         }
 
-        return "<$priority>1 " .
-            $this->getDateTime() . " " .
-            $hostname . " " .
-            $this->ident . " " .
-            $pid . " - - ";
-    }
-
-    protected function getDateTime()
-    {
-        return date(\DateTime::RFC3339);
+        if ($this->rfc === self::RFC3164) {
+            $datetime->setTimezone(new \DateTimeZone('UTC'));
+        }
+        $date = $datetime->format($this->dateFormats[$this->rfc]);
+
+        if ($this->rfc === self::RFC3164) {
+            return "<$priority>" .
+                $date . " " .
+                $hostname . " " .
+                $this->ident . "[" . $pid . "]: ";
+        } else {
+            return "<$priority>1 " .
+                $date . " " .
+                $hostname . " " .
+                $this->ident . " " .
+                $pid . " - - ";
+        }
     }
 
     /**
      * Inject your own socket, mainly used for testing
      */
-    public function setSocket($socket)
+    public function setSocket(UdpSocket $socket): self
     {
         $this->socket = $socket;
+
+        return $this;
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php
index b6b1343..4260f74 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,6 +11,8 @@
 
 namespace Monolog\Handler;
 
+use Monolog\Logger;
+
 /**
  * Used for testing purposes.
  *
@@ -65,8 +67,9 @@ namespace Monolog\Handler;
  */
 class TestHandler extends AbstractProcessingHandler
 {
-    protected $records = array();
-    protected $recordsByLevel = array();
+    protected $records = [];
+    protected $recordsByLevel = [];
+    private $skipReset = false;
 
     public function getRecords()
     {
@@ -75,20 +78,35 @@ class TestHandler extends AbstractProcessingHandler
 
     public function clear()
     {
-        $this->records = array();
-        $this->recordsByLevel = array();
+        $this->records = [];
+        $this->recordsByLevel = [];
+    }
+
+    public function reset()
+    {
+        if (!$this->skipReset) {
+            $this->clear();
+        }
     }
 
-    public function hasRecords($level)
+    public function setSkipReset(bool $skipReset)
+    {
+        $this->skipReset = $skipReset;
+    }
+
+    /**
+     * @param string|int $level Logging level value or name
+     */
+    public function hasRecords($level): bool
     {
-        return isset($this->recordsByLevel[$level]);
+        return isset($this->recordsByLevel[Logger::toMonologLevel($level)]);
     }
 
     /**
      * @param string|array $record Either a message string or an array containing message and optionally context keys that will be checked against all records
-     * @param int          $level  Logger::LEVEL constant value
+     * @param string|int   $level  Logging level value or name
      */
-    public function hasRecord($record, $level)
+    public function hasRecord($record, $level): bool
     {
         if (is_string($record)) {
             $record = array('message' => $record);
@@ -101,29 +119,37 @@ class TestHandler extends AbstractProcessingHandler
             if (isset($record['context']) && $rec['context'] !== $record['context']) {
                 return false;
             }
+
             return true;
         }, $level);
     }
 
-    public function hasRecordThatContains($message, $level)
+    /**
+     * @param string|int $level Logging level value or name
+     */
+    public function hasRecordThatContains(string $message, $level): bool
     {
         return $this->hasRecordThatPasses(function ($rec) use ($message) {
             return strpos($rec['message'], $message) !== false;
         }, $level);
     }
 
-    public function hasRecordThatMatches($regex, $level)
+    /**
+     * @param string|int $level Logging level value or name
+     */
+    public function hasRecordThatMatches(string $regex, $level): bool
     {
         return $this->hasRecordThatPasses(function ($rec) use ($regex) {
             return preg_match($regex, $rec['message']) > 0;
         }, $level);
     }
 
-    public function hasRecordThatPasses($predicate, $level)
+    /**
+     * @param string|int $level Logging level value or name
+     */
+    public function hasRecordThatPasses(callable $predicate, $level)
     {
-        if (!is_callable($predicate)) {
-            throw new \InvalidArgumentException("Expected a callable for hasRecordThatSucceeds");
-        }
+        $level = Logger::toMonologLevel($level);
 
         if (!isset($this->recordsByLevel[$level])) {
             return false;
@@ -141,7 +167,7 @@ class TestHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         $this->recordsByLevel[$record['level']][] = $record;
         $this->records[] = $record;
@@ -155,7 +181,7 @@ class TestHandler extends AbstractProcessingHandler
             if (method_exists($this, $genericMethod)) {
                 $args[] = $level;
 
-                return call_user_func_array(array($this, $genericMethod), $args);
+                return call_user_func_array([$this, $genericMethod], $args);
             }
         }
 
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php
index 6bc4671..16c3cbb 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -22,19 +22,15 @@ class WhatFailureGroupHandler extends GroupHandler
     /**
      * {@inheritdoc}
      */
-    public function handle(array $record)
+    public function handle(array $record): bool
     {
         if ($this->processors) {
-            foreach ($this->processors as $processor) {
-                $record = call_user_func($processor, $record);
-            }
+            $record = $this->processRecord($record);
         }
 
         foreach ($this->handlers as $handler) {
             try {
                 $handler->handle($record);
-            } catch (\Exception $e) {
-                // What failure?
             } catch (\Throwable $e) {
                 // What failure?
             }
@@ -46,14 +42,12 @@ class WhatFailureGroupHandler extends GroupHandler
     /**
      * {@inheritdoc}
      */
-    public function handleBatch(array $records)
+    public function handleBatch(array $records): void
     {
         if ($this->processors) {
             $processed = array();
             foreach ($records as $record) {
-                foreach ($this->processors as $processor) {
-                    $processed[] = call_user_func($processor, $record);
-                }
+                $processed[] = $this->processRecord($record);
             }
             $records = $processed;
         }
@@ -61,8 +55,6 @@ class WhatFailureGroupHandler extends GroupHandler
         foreach ($this->handlers as $handler) {
             try {
                 $handler->handleBatch($records);
-            } catch (\Exception $e) {
-                // What failure?
             } catch (\Throwable $e) {
                 // What failure?
             }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php
index f22cf21..d664fa8 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php
@@ -1,4 +1,5 @@
-<?php
+<?php declare(strict_types=1);
+
 /*
  * This file is part of the Monolog package.
  *
@@ -10,6 +11,7 @@
 
 namespace Monolog\Handler;
 
+use Monolog\Formatter\FormatterInterface;
 use Monolog\Formatter\NormalizerFormatter;
 use Monolog\Logger;
 
@@ -17,6 +19,7 @@ use Monolog\Logger;
  * Handler sending logs to Zend Monitor
  *
  * @author  Christian Bergau <cbergau86@gmail.com>
+ * @author  Jason Davis <happydude@jasondavis.net>
  */
 class ZendMonitorHandler extends AbstractProcessingHandler
 {
@@ -25,70 +28,68 @@ class ZendMonitorHandler extends AbstractProcessingHandler
      *
      * @var array
      */
-    protected $levelMap = array(
-        Logger::DEBUG     => 1,
-        Logger::INFO      => 2,
-        Logger::NOTICE    => 3,
-        Logger::WARNING   => 4,
-        Logger::ERROR     => 5,
-        Logger::CRITICAL  => 6,
-        Logger::ALERT     => 7,
-        Logger::EMERGENCY => 0,
-    );
+    protected $levelMap = [];
 
     /**
-     * Construct
-     *
-     * @param  int                       $level
-     * @param  bool                      $bubble
+     * @param  string|int                $level  The minimum logging level at which this handler will be triggered.
+     * @param  bool                      $bubble Whether the messages that are handled can bubble up the stack or not.
      * @throws MissingExtensionException
      */
-    public function __construct($level = Logger::DEBUG, $bubble = true)
+    public function __construct($level = Logger::DEBUG, bool $bubble = true)
     {
         if (!function_exists('zend_monitor_custom_event')) {
-            throw new MissingExtensionException('You must have Zend Server installed in order to use this handler');
+            throw new MissingExtensionException(
+                'You must have Zend Server installed with Zend Monitor enabled in order to use this handler'
+            );
         }
+        //zend monitor constants are not defined if zend monitor is not enabled.
+        $this->levelMap = [
+            Logger::DEBUG     => \ZEND_MONITOR_EVENT_SEVERITY_INFO,
+            Logger::INFO      => \ZEND_MONITOR_EVENT_SEVERITY_INFO,
+            Logger::NOTICE    => \ZEND_MONITOR_EVENT_SEVERITY_INFO,
+            Logger::WARNING   => \ZEND_MONITOR_EVENT_SEVERITY_WARNING,
+            Logger::ERROR     => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
+            Logger::CRITICAL  => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
+            Logger::ALERT     => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
+            Logger::EMERGENCY => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
+        ];
         parent::__construct($level, $bubble);
     }
 
     /**
      * {@inheritdoc}
      */
-    protected function write(array $record)
+    protected function write(array $record): void
     {
         $this->writeZendMonitorCustomEvent(
-            $this->levelMap[$record['level']],
+            Logger::getLevelName($record['level']),
             $record['message'],
-            $record['formatted']
+            $record['formatted'],
+            $this->levelMap[$record['level']]
         );
     }
 
     /**
-     * Write a record to Zend Monitor
-     *
-     * @param int    $level
-     * @param string $message
-     * @param array  $formatted
+     * Write to Zend Monitor Events
+     * @param string $type Text displayed in "Class Name (custom)" field
+     * @param string $message Text displayed in "Error String"
+     * @param mixed $formatted Displayed in Custom Variables tab
+     * @param int $severity Set the event severity level (-1,0,1)
      */
-    protected function writeZendMonitorCustomEvent($level, $message, $formatted)
+    protected function writeZendMonitorCustomEvent(string $type, string $message, array $formatted, int $severity): void
     {
-        zend_monitor_custom_event($level, $message, $formatted);
+        zend_monitor_custom_event($type, $message, $formatted, $severity);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getDefaultFormatter()
+    public function getDefaultFormatter(): FormatterInterface
     {
         return new NormalizerFormatter();
     }
 
-    /**
-     * Get the level map
-     *
-     * @return array
-     */
-    public function getLevelMap()
+    public function getLevelMap(): array
     {
         return $this->levelMap;
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Logger.php b/vendor/monolog/monolog/src/Monolog/Logger.php
index 05dfc81..a8e9787 100644
--- a/vendor/monolog/monolog/src/Monolog/Logger.php
+++ b/vendor/monolog/monolog/src/Monolog/Logger.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,11 +11,11 @@
 
 namespace Monolog;
 
+use DateTimeZone;
 use Monolog\Handler\HandlerInterface;
-use Monolog\Handler\StreamHandler;
 use Psr\Log\LoggerInterface;
 use Psr\Log\InvalidArgumentException;
-use Exception;
+use Throwable;
 
 /**
  * Monolog log channel
@@ -30,19 +30,19 @@ class Logger implements LoggerInterface, ResettableInterface
     /**
      * Detailed debug information
      */
-    const DEBUG = 100;
+    public const DEBUG = 100;
 
     /**
      * Interesting events
      *
      * Examples: User logs in, SQL logs.
      */
-    const INFO = 200;
+    public const INFO = 200;
 
     /**
      * Uncommon events
      */
-    const NOTICE = 250;
+    public const NOTICE = 250;
 
     /**
      * Exceptional occurrences that are not errors
@@ -50,19 +50,19 @@ class Logger implements LoggerInterface, ResettableInterface
      * Examples: Use of deprecated APIs, poor use of an API,
      * undesirable things that are not necessarily wrong.
      */
-    const WARNING = 300;
+    public const WARNING = 300;
 
     /**
      * Runtime errors
      */
-    const ERROR = 400;
+    public const ERROR = 400;
 
     /**
      * Critical conditions
      *
      * Example: Application component unavailable, unexpected exception.
      */
-    const CRITICAL = 500;
+    public const CRITICAL = 500;
 
     /**
      * Action must be taken immediately
@@ -70,12 +70,12 @@ class Logger implements LoggerInterface, ResettableInterface
      * Example: Entire website down, database unavailable, etc.
      * This should trigger the SMS alerts and wake you up.
      */
-    const ALERT = 550;
+    public const ALERT = 550;
 
     /**
      * Urgent alert.
      */
-    const EMERGENCY = 600;
+    public const EMERGENCY = 600;
 
     /**
      * Monolog API version
@@ -85,14 +85,14 @@ class Logger implements LoggerInterface, ResettableInterface
      *
      * @var int
      */
-    const API = 1;
+    public const API = 2;
 
     /**
-     * Logging levels from syslog protocol defined in RFC 5424
+     * This is a static variable and not a constant to serve as an extension point for custom levels
      *
-     * @var array $levels Logging levels
+     * @var string[] $levels Logging levels with the levels as key
      */
-    protected static $levels = array(
+    protected static $levels = [
         self::DEBUG     => 'DEBUG',
         self::INFO      => 'INFO',
         self::NOTICE    => 'NOTICE',
@@ -101,12 +101,7 @@ class Logger implements LoggerInterface, ResettableInterface
         self::CRITICAL  => 'CRITICAL',
         self::ALERT     => 'ALERT',
         self::EMERGENCY => 'EMERGENCY',
-    );
-
-    /**
-     * @var \DateTimeZone
-     */
-    protected static $timezone;
+    ];
 
     /**
      * @var string
@@ -135,36 +130,38 @@ class Logger implements LoggerInterface, ResettableInterface
     protected $microsecondTimestamps = true;
 
     /**
-     * @var callable
+     * @var DateTimeZone
+     */
+    protected $timezone;
+
+    /**
+     * @var callable|null
      */
     protected $exceptionHandler;
 
     /**
-     * @param string             $name       The logging channel
+     * @param string             $name       The logging channel, a simple descriptive name that is attached to all log records
      * @param HandlerInterface[] $handlers   Optional stack of handlers, the first one in the array is called first, etc.
      * @param callable[]         $processors Optional array of processors
+     * @param DateTimeZone|null  $timezone   Optional timezone, if not provided date_default_timezone_get() will be used
      */
-    public function __construct($name, array $handlers = array(), array $processors = array())
+    public function __construct(string $name, array $handlers = [], array $processors = [], ?DateTimeZone $timezone = null)
     {
         $this->name = $name;
         $this->setHandlers($handlers);
         $this->processors = $processors;
+        $this->timezone = $timezone ?: new DateTimeZone(date_default_timezone_get() ?: 'UTC');
     }
 
-    /**
-     * @return string
-     */
-    public function getName()
+    public function getName(): string
     {
         return $this->name;
     }
 
     /**
      * Return a new cloned instance with the name changed
-     *
-     * @return static
      */
-    public function withName($name)
+    public function withName(string $name): self
     {
         $new = clone $this;
         $new->name = $name;
@@ -174,11 +171,8 @@ class Logger implements LoggerInterface, ResettableInterface
 
     /**
      * Pushes a handler on to the stack.
-     *
-     * @param  HandlerInterface $handler
-     * @return $this
      */
-    public function pushHandler(HandlerInterface $handler)
+    public function pushHandler(HandlerInterface $handler): self
     {
         array_unshift($this->handlers, $handler);
 
@@ -188,9 +182,9 @@ class Logger implements LoggerInterface, ResettableInterface
     /**
      * Pops a handler from the stack
      *
-     * @return HandlerInterface
+     * @throws \LogicException If empty handler stack
      */
-    public function popHandler()
+    public function popHandler(): HandlerInterface
     {
         if (!$this->handlers) {
             throw new \LogicException('You tried to pop from an empty handler stack.');
@@ -204,12 +198,11 @@ class Logger implements LoggerInterface, ResettableInterface
      *
      * If a map is passed, keys will be ignored.
      *
-     * @param  HandlerInterface[] $handlers
-     * @return $this
+     * @param HandlerInterface[] $handlers
      */
-    public function setHandlers(array $handlers)
+    public function setHandlers(array $handlers): self
     {
-        $this->handlers = array();
+        $this->handlers = [];
         foreach (array_reverse($handlers) as $handler) {
             $this->pushHandler($handler);
         }
@@ -220,22 +213,16 @@ class Logger implements LoggerInterface, ResettableInterface
     /**
      * @return HandlerInterface[]
      */
-    public function getHandlers()
+    public function getHandlers(): array
     {
         return $this->handlers;
     }
 
     /**
      * Adds a processor on to the stack.
-     *
-     * @param  callable $callback
-     * @return $this
      */
-    public function pushProcessor($callback)
+    public function pushProcessor(callable $callback): self
     {
-        if (!is_callable($callback)) {
-            throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given');
-        }
         array_unshift($this->processors, $callback);
 
         return $this;
@@ -244,9 +231,10 @@ class Logger implements LoggerInterface, ResettableInterface
     /**
      * Removes the processor on top of the stack and returns it.
      *
+     * @throws \LogicException If empty processor stack
      * @return callable
      */
-    public function popProcessor()
+    public function popProcessor(): callable
     {
         if (!$this->processors) {
             throw new \LogicException('You tried to pop from an empty processor stack.');
@@ -258,7 +246,7 @@ class Logger implements LoggerInterface, ResettableInterface
     /**
      * @return callable[]
      */
-    public function getProcessors()
+    public function getProcessors(): array
     {
         return $this->processors;
     }
@@ -267,79 +255,70 @@ class Logger implements LoggerInterface, ResettableInterface
      * Control the use of microsecond resolution timestamps in the 'datetime'
      * member of new records.
      *
-     * Generating microsecond resolution timestamps by calling
+     * On PHP7.0, generating microsecond resolution timestamps by calling
      * microtime(true), formatting the result via sprintf() and then parsing
      * the resulting string via \DateTime::createFromFormat() can incur
      * a measurable runtime overhead vs simple usage of DateTime to capture
      * a second resolution timestamp in systems which generate a large number
      * of log events.
      *
+     * On PHP7.1 however microseconds are always included by the engine, so
+     * this setting can be left alone unless you really want to suppress
+     * microseconds in the output.
+     *
      * @param bool $micro True to use microtime() to create timestamps
      */
-    public function useMicrosecondTimestamps($micro)
+    public function useMicrosecondTimestamps(bool $micro)
     {
-        $this->microsecondTimestamps = (bool) $micro;
+        $this->microsecondTimestamps = $micro;
     }
 
     /**
      * Adds a log record.
      *
-     * @param  int     $level   The logging level
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return bool Whether the record has been processed
+     * @param  int    $level   The logging level
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
-    public function addRecord($level, $message, array $context = array())
+    public function addRecord(int $level, string $message, array $context = []): bool
     {
-        if (!$this->handlers) {
-            $this->pushHandler(new StreamHandler('php://stderr', static::DEBUG));
-        }
-
-        $levelName = static::getLevelName($level);
-
         // check if any handler will handle this message so we can return early and save cycles
         $handlerKey = null;
-        reset($this->handlers);
-        while ($handler = current($this->handlers)) {
-            if ($handler->isHandling(array('level' => $level))) {
-                $handlerKey = key($this->handlers);
+        foreach ($this->handlers as $key => $handler) {
+            if ($handler->isHandling(['level' => $level])) {
+                $handlerKey = $key;
                 break;
             }
-
-            next($this->handlers);
         }
 
         if (null === $handlerKey) {
             return false;
         }
 
-        if (!static::$timezone) {
-            static::$timezone = new \DateTimeZone(date_default_timezone_get() ?: 'UTC');
-        }
-
-        // php7.1+ always has microseconds enabled, so we do not need this hack
-        if ($this->microsecondTimestamps && PHP_VERSION_ID < 70100) {
-            $ts = \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true)), static::$timezone);
-        } else {
-            $ts = new \DateTime(null, static::$timezone);
-        }
-        $ts->setTimezone(static::$timezone);
+        $levelName = static::getLevelName($level);
 
-        $record = array(
-            'message' => (string) $message,
+        $record = [
+            'message' => $message,
             'context' => $context,
             'level' => $level,
             'level_name' => $levelName,
             'channel' => $this->name,
-            'datetime' => $ts,
-            'extra' => array(),
-        );
+            'datetime' => new DateTimeImmutable($this->microsecondTimestamps, $this->timezone),
+            'extra' => [],
+        ];
 
         try {
             foreach ($this->processors as $processor) {
                 $record = call_user_func($processor, $record);
             }
 
+            // advance the array pointer to the first handler that will handle this record
+            reset($this->handlers);
+            while ($handlerKey !== key($this->handlers)) {
+                next($this->handlers);
+            }
+
             while ($handler = current($this->handlers)) {
                 if (true === $handler->handle($record)) {
                     break;
@@ -347,7 +326,7 @@ class Logger implements LoggerInterface, ResettableInterface
 
                 next($this->handlers);
             }
-        } catch (Exception $e) {
+        } catch (Throwable $e) {
             $this->handleException($e, $record);
         }
 
@@ -364,12 +343,10 @@ class Logger implements LoggerInterface, ResettableInterface
      * This is useful at the end of a request and will be called automatically on every handler
      * when they get destructed.
      */
-    public function close()
+    public function close(): void
     {
         foreach ($this->handlers as $handler) {
-            if (method_exists($handler, 'close')) {
-                $handler->close();
-            }
+            $handler->close();
         }
     }
 
@@ -383,7 +360,7 @@ class Logger implements LoggerInterface, ResettableInterface
      * have a long running process like a worker or an application server serving multiple requests
      * in one process.
      */
-    public function reset()
+    public function reset(): void
     {
         foreach ($this->handlers as $handler) {
             if ($handler instanceof ResettableInterface) {
@@ -399,107 +376,11 @@ class Logger implements LoggerInterface, ResettableInterface
     }
 
     /**
-     * Adds a log record at the DEBUG level.
-     *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
-     */
-    public function addDebug($message, array $context = array())
-    {
-        return $this->addRecord(static::DEBUG, $message, $context);
-    }
-
-    /**
-     * Adds a log record at the INFO level.
-     *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
-     */
-    public function addInfo($message, array $context = array())
-    {
-        return $this->addRecord(static::INFO, $message, $context);
-    }
-
-    /**
-     * Adds a log record at the NOTICE level.
-     *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
-     */
-    public function addNotice($message, array $context = array())
-    {
-        return $this->addRecord(static::NOTICE, $message, $context);
-    }
-
-    /**
-     * Adds a log record at the WARNING level.
-     *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
-     */
-    public function addWarning($message, array $context = array())
-    {
-        return $this->addRecord(static::WARNING, $message, $context);
-    }
-
-    /**
-     * Adds a log record at the ERROR level.
-     *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
-     */
-    public function addError($message, array $context = array())
-    {
-        return $this->addRecord(static::ERROR, $message, $context);
-    }
-
-    /**
-     * Adds a log record at the CRITICAL level.
-     *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
-     */
-    public function addCritical($message, array $context = array())
-    {
-        return $this->addRecord(static::CRITICAL, $message, $context);
-    }
-
-    /**
-     * Adds a log record at the ALERT level.
-     *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
-     */
-    public function addAlert($message, array $context = array())
-    {
-        return $this->addRecord(static::ALERT, $message, $context);
-    }
-
-    /**
-     * Adds a log record at the EMERGENCY level.
-     *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
-     */
-    public function addEmergency($message, array $context = array())
-    {
-        return $this->addRecord(static::EMERGENCY, $message, $context);
-    }
-
-    /**
      * Gets all supported logging levels.
      *
      * @return array Assoc array with human-readable level names => level codes.
      */
-    public static function getLevels()
+    public static function getLevels(): array
     {
         return array_flip(static::$levels);
     }
@@ -507,10 +388,9 @@ class Logger implements LoggerInterface, ResettableInterface
     /**
      * Gets the name of the logging level.
      *
-     * @param  int    $level
-     * @return string
+     * @throws \Psr\Log\InvalidArgumentException If level is not defined
      */
-    public static function getLevelName($level)
+    public static function getLevelName(int $level): string
     {
         if (!isset(static::$levels[$level])) {
             throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels)));
@@ -522,13 +402,21 @@ class Logger implements LoggerInterface, ResettableInterface
     /**
      * Converts PSR-3 levels to Monolog ones if necessary
      *
-     * @param string|int Level number (monolog) or name (PSR-3)
-     * @return int
+     * @param  string|int                        $level Level number (monolog) or name (PSR-3)
+     * @throws \Psr\Log\InvalidArgumentException If level is not defined
      */
-    public static function toMonologLevel($level)
+    public static function toMonologLevel($level): int
     {
-        if (is_string($level) && defined(__CLASS__.'::'.strtoupper($level))) {
-            return constant(__CLASS__.'::'.strtoupper($level));
+        if (is_string($level)) {
+            if (defined(__CLASS__.'::'.strtoupper($level))) {
+                return constant(__CLASS__.'::'.strtoupper($level));
+            }
+
+            throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels)));
+        }
+
+        if (!is_int($level)) {
+            throw new InvalidArgumentException('Level "'.var_export($level, true).'" is not defined, use one of: '.implode(', ', array_keys(static::$levels)));
         }
 
         return $level;
@@ -536,15 +424,12 @@ class Logger implements LoggerInterface, ResettableInterface
 
     /**
      * Checks whether the Logger has a handler that listens on the given level
-     *
-     * @param  int     $level
-     * @return bool
      */
-    public function isHandling($level)
+    public function isHandling(int $level): bool
     {
-        $record = array(
+        $record = [
             'level' => $level,
-        );
+        ];
 
         foreach ($this->handlers as $handler) {
             if ($handler->isHandling($record)) {
@@ -556,57 +441,36 @@ class Logger implements LoggerInterface, ResettableInterface
     }
 
     /**
-     * Set a custom exception handler
+     * Set a custom exception handler that will be called if adding a new record fails
      *
-     * @param  callable $callback
-     * @return $this
+     * The callable will receive an exception object and the record that failed to be logged
      */
-    public function setExceptionHandler($callback)
+    public function setExceptionHandler(?callable $callback): self
     {
-        if (!is_callable($callback)) {
-            throw new \InvalidArgumentException('Exception handler must be valid callable (callback or object with an __invoke method), '.var_export($callback, true).' given');
-        }
         $this->exceptionHandler = $callback;
 
         return $this;
     }
 
-    /**
-     * @return callable
-     */
-    public function getExceptionHandler()
+    public function getExceptionHandler(): ?callable
     {
         return $this->exceptionHandler;
     }
 
     /**
-     * Delegates exception management to the custom exception handler,
-     * or throws the exception if no custom handler is set.
-     */
-    protected function handleException(Exception $e, array $record)
-    {
-        if (!$this->exceptionHandler) {
-            throw $e;
-        }
-
-        call_user_func($this->exceptionHandler, $e, $record);
-    }
-
-    /**
      * Adds a log record at an arbitrary level.
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  mixed   $level   The log level
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
+     * @param mixed  $level   The log level
+     * @param string $message The log message
+     * @param array  $context The log context
      */
-    public function log($level, $message, array $context = array())
+    public function log($level, $message, array $context = []): void
     {
         $level = static::toMonologLevel($level);
 
-        return $this->addRecord($level, $message, $context);
+        $this->addRecord($level, (string) $message, $context);
     }
 
     /**
@@ -614,13 +478,12 @@ class Logger implements LoggerInterface, ResettableInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
+     * @param string $message The log message
+     * @param array  $context The log context
      */
-    public function debug($message, array $context = array())
+    public function debug($message, array $context = []): void
     {
-        return $this->addRecord(static::DEBUG, $message, $context);
+        $this->addRecord(static::DEBUG, (string) $message, $context);
     }
 
     /**
@@ -628,13 +491,12 @@ class Logger implements LoggerInterface, ResettableInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
+     * @param string $message The log message
+     * @param array  $context The log context
      */
-    public function info($message, array $context = array())
+    public function info($message, array $context = []): void
     {
-        return $this->addRecord(static::INFO, $message, $context);
+        $this->addRecord(static::INFO, (string) $message, $context);
     }
 
     /**
@@ -642,27 +504,12 @@ class Logger implements LoggerInterface, ResettableInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
-     */
-    public function notice($message, array $context = array())
-    {
-        return $this->addRecord(static::NOTICE, $message, $context);
-    }
-
-    /**
-     * Adds a log record at the WARNING level.
-     *
-     * This method allows for compatibility with common interfaces.
-     *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
+     * @param string $message The log message
+     * @param array  $context The log context
      */
-    public function warn($message, array $context = array())
+    public function notice($message, array $context = []): void
     {
-        return $this->addRecord(static::WARNING, $message, $context);
+        $this->addRecord(static::NOTICE, (string) $message, $context);
     }
 
     /**
@@ -670,27 +517,12 @@ class Logger implements LoggerInterface, ResettableInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
-     */
-    public function warning($message, array $context = array())
-    {
-        return $this->addRecord(static::WARNING, $message, $context);
-    }
-
-    /**
-     * Adds a log record at the ERROR level.
-     *
-     * This method allows for compatibility with common interfaces.
-     *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
+     * @param string $message The log message
+     * @param array  $context The log context
      */
-    public function err($message, array $context = array())
+    public function warning($message, array $context = []): void
     {
-        return $this->addRecord(static::ERROR, $message, $context);
+        $this->addRecord(static::WARNING, (string) $message, $context);
     }
 
     /**
@@ -698,13 +530,12 @@ class Logger implements LoggerInterface, ResettableInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
+     * @param string $message The log message
+     * @param array  $context The log context
      */
-    public function error($message, array $context = array())
+    public function error($message, array $context = []): void
     {
-        return $this->addRecord(static::ERROR, $message, $context);
+        $this->addRecord(static::ERROR, (string) $message, $context);
     }
 
     /**
@@ -712,80 +543,68 @@ class Logger implements LoggerInterface, ResettableInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
+     * @param string $message The log message
+     * @param array  $context The log context
      */
-    public function crit($message, array $context = array())
+    public function critical($message, array $context = []): void
     {
-        return $this->addRecord(static::CRITICAL, $message, $context);
+        $this->addRecord(static::CRITICAL, (string) $message, $context);
     }
 
     /**
-     * Adds a log record at the CRITICAL level.
+     * Adds a log record at the ALERT level.
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
+     * @param string $message The log message
+     * @param array  $context The log context
      */
-    public function critical($message, array $context = array())
+    public function alert($message, array $context = []): void
     {
-        return $this->addRecord(static::CRITICAL, $message, $context);
+        $this->addRecord(static::ALERT, (string) $message, $context);
     }
 
     /**
-     * Adds a log record at the ALERT level.
+     * Adds a log record at the EMERGENCY level.
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
+     * @param string $message The log message
+     * @param array  $context The log context
      */
-    public function alert($message, array $context = array())
+    public function emergency($message, array $context = []): void
     {
-        return $this->addRecord(static::ALERT, $message, $context);
+        $this->addRecord(static::EMERGENCY, (string) $message, $context);
     }
 
     /**
-     * Adds a log record at the EMERGENCY level.
-     *
-     * This method allows for compatibility with common interfaces.
-     *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
+     * Sets the timezone to be used for the timestamp of log records.
      */
-    public function emerg($message, array $context = array())
+    public function setTimezone(DateTimeZone $tz): self
     {
-        return $this->addRecord(static::EMERGENCY, $message, $context);
+        $this->timezone = $tz;
+
+        return $this;
     }
 
     /**
-     * Adds a log record at the EMERGENCY level.
-     *
-     * This method allows for compatibility with common interfaces.
-     *
-     * @param  string $message The log message
-     * @param  array  $context The log context
-     * @return bool   Whether the record has been processed
+     * Returns the timezone to be used for the timestamp of log records.
      */
-    public function emergency($message, array $context = array())
+    public function getTimezone(): DateTimeZone
     {
-        return $this->addRecord(static::EMERGENCY, $message, $context);
+        return $this->timezone;
     }
 
     /**
-     * Set the timezone to be used for the timestamp of log records.
-     *
-     * This is stored globally for all Logger instances
-     *
-     * @param \DateTimeZone $tz Timezone object
+     * Delegates exception management to the custom exception handler,
+     * or throws the exception if no custom handler is set.
      */
-    public static function setTimezone(\DateTimeZone $tz)
+    protected function handleException(Throwable $e, array $record)
     {
-        self::$timezone = $tz;
+        if (!$this->exceptionHandler) {
+            throw $e;
+        }
+
+        call_user_func($this->exceptionHandler, $e, $record);
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php
index 9fc3f50..1367ee6 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -24,16 +24,15 @@ class GitProcessor implements ProcessorInterface
     private $level;
     private static $cache;
 
+    /**
+     * @param string|int $level The minimum logging level at which this Processor will be triggered
+     */
     public function __construct($level = Logger::DEBUG)
     {
         $this->level = Logger::toMonologLevel($level);
     }
 
-    /**
-     * @param  array $record
-     * @return array
-     */
-    public function __invoke(array $record)
+    public function __invoke(array $record): array
     {
         // return if the level is not high enough
         if ($record['level'] < $this->level) {
@@ -45,7 +44,7 @@ class GitProcessor implements ProcessorInterface
         return $record;
     }
 
-    private static function getGitInfo()
+    private static function getGitInfo(): array
     {
         if (self::$cache) {
             return self::$cache;
@@ -53,12 +52,12 @@ class GitProcessor implements ProcessorInterface
 
         $branches = `git branch -v --no-abbrev`;
         if (preg_match('{^\* (.+?)\s+([a-f0-9]{40})(?:\s|$)}m', $branches, $matches)) {
-            return self::$cache = array(
+            return self::$cache = [
                 'branch' => $matches[1],
                 'commit' => $matches[2],
-            );
+            ];
         }
 
-        return self::$cache = array();
+        return self::$cache = [];
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php
index 6ae192a..c0cc014 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -32,35 +32,29 @@ class IntrospectionProcessor implements ProcessorInterface
 
     private $skipStackFramesCount;
 
-    private $skipFunctions = array(
+    private $skipFunctions = [
         'call_user_func',
         'call_user_func_array',
-    );
+    ];
 
-    public function __construct($level = Logger::DEBUG, array $skipClassesPartials = array(), $skipStackFramesCount = 0)
+    /**
+     * @param string|int $level The minimum logging level at which this Processor will be triggered
+     */
+    public function __construct($level = Logger::DEBUG, array $skipClassesPartials = [], int $skipStackFramesCount = 0)
     {
         $this->level = Logger::toMonologLevel($level);
-        $this->skipClassesPartials = array_merge(array('Monolog\\'), $skipClassesPartials);
+        $this->skipClassesPartials = array_merge(['Monolog\\'], $skipClassesPartials);
         $this->skipStackFramesCount = $skipStackFramesCount;
     }
 
-    /**
-     * @param  array $record
-     * @return array
-     */
-    public function __invoke(array $record)
+    public function __invoke(array $record): array
     {
         // return if the level is not high enough
         if ($record['level'] < $this->level) {
             return $record;
         }
 
-        /*
-        * http://php.net/manual/en/function.debug-backtrace.php
-        * As of 5.3.6, DEBUG_BACKTRACE_IGNORE_ARGS option was added.
-        * Any version less than 5.3.6 must use the DEBUG_BACKTRACE_IGNORE_ARGS constant value '2'.
-        */
-        $trace = debug_backtrace((PHP_VERSION_ID < 50306) ? 2 : DEBUG_BACKTRACE_IGNORE_ARGS);
+        $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
 
         // skip first since it's always the current method
         array_shift($trace);
@@ -74,11 +68,13 @@ class IntrospectionProcessor implements ProcessorInterface
                 foreach ($this->skipClassesPartials as $part) {
                     if (strpos($trace[$i]['class'], $part) !== false) {
                         $i++;
+
                         continue 2;
                     }
                 }
             } elseif (in_array($trace[$i]['function'], $this->skipFunctions)) {
                 $i++;
+
                 continue;
             }
 
@@ -90,18 +86,18 @@ class IntrospectionProcessor implements ProcessorInterface
         // we should have the call source now
         $record['extra'] = array_merge(
             $record['extra'],
-            array(
+            [
                 'file'      => isset($trace[$i - 1]['file']) ? $trace[$i - 1]['file'] : null,
                 'line'      => isset($trace[$i - 1]['line']) ? $trace[$i - 1]['line'] : null,
                 'class'     => isset($trace[$i]['class']) ? $trace[$i]['class'] : null,
                 'function'  => isset($trace[$i]['function']) ? $trace[$i]['function'] : null,
-            )
+            ]
         );
 
         return $record;
     }
 
-    private function isTraceClassOrSkippedFunction(array $trace, $index)
+    private function isTraceClassOrSkippedFunction(array $trace, int $index)
     {
         if (!isset($trace[$index])) {
             return false;
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php
index 0543e92..a1eef61 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -19,16 +19,15 @@ namespace Monolog\Processor;
  */
 class MemoryPeakUsageProcessor extends MemoryProcessor
 {
-    /**
-     * @param  array $record
-     * @return array
-     */
-    public function __invoke(array $record)
+    public function __invoke(array $record): array
     {
-        $bytes = memory_get_peak_usage($this->realUsage);
-        $formatted = $this->formatBytes($bytes);
+        $usage = memory_get_peak_usage($this->realUsage);
 
-        $record['extra']['memory_peak_usage'] = $formatted;
+        if ($this->useFormatting) {
+            $usage = $this->formatBytes($usage);
+        }
+
+        $record['extra']['memory_peak_usage'] = $usage;
 
         return $record;
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php
index 2a379a3..227deb7 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -32,22 +32,20 @@ abstract class MemoryProcessor implements ProcessorInterface
      * @param bool $realUsage     Set this to true to get the real size of memory allocated from system.
      * @param bool $useFormatting If true, then format memory size to human readable string (MB, KB, B depending on size)
      */
-    public function __construct($realUsage = true, $useFormatting = true)
+    public function __construct(bool $realUsage = true, bool $useFormatting = true)
     {
-        $this->realUsage = (bool) $realUsage;
-        $this->useFormatting = (bool) $useFormatting;
+        $this->realUsage = $realUsage;
+        $this->useFormatting = $useFormatting;
     }
 
     /**
      * Formats bytes into a human readable string if $this->useFormatting is true, otherwise return $bytes as is
      *
      * @param  int        $bytes
-     * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as is
+     * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as int
      */
-    protected function formatBytes($bytes)
+    protected function formatBytes(int $bytes)
     {
-        $bytes = (int) $bytes;
-
         if (!$this->useFormatting) {
             return $bytes;
         }
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php
index 2783d65..653c76d 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -19,16 +19,15 @@ namespace Monolog\Processor;
  */
 class MemoryUsageProcessor extends MemoryProcessor
 {
-    /**
-     * @param  array $record
-     * @return array
-     */
-    public function __invoke(array $record)
+    public function __invoke(array $record): array
     {
-        $bytes = memory_get_usage($this->realUsage);
-        $formatted = $this->formatBytes($bytes);
+        $usage = memory_get_usage($this->realUsage);
 
-        $record['extra']['memory_usage'] = $formatted;
+        if ($this->useFormatting) {
+            $usage = $this->formatBytes($usage);
+        }
+
+        $record['extra']['memory_usage'] = $usage;
 
         return $record;
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php
index 2f5b326..d50f713 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php
@@ -1,9 +1,9 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
  *
- * (c) Jonathan A. Schweder <jonathanschweder@gmail.com>
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
@@ -23,16 +23,15 @@ class MercurialProcessor implements ProcessorInterface
     private $level;
     private static $cache;
 
+    /**
+     * @param string|int $level The minimum logging level at which this Processor will be triggered
+     */
     public function __construct($level = Logger::DEBUG)
     {
         $this->level = Logger::toMonologLevel($level);
     }
 
-    /**
-     * @param  array $record
-     * @return array
-     */
-    public function __invoke(array $record)
+    public function __invoke(array $record): array
     {
         // return if the level is not high enough
         if ($record['level'] < $this->level) {
@@ -44,20 +43,21 @@ class MercurialProcessor implements ProcessorInterface
         return $record;
     }
 
-    private static function getMercurialInfo()
+    private static function getMercurialInfo(): array
     {
         if (self::$cache) {
             return self::$cache;
         }
 
         $result = explode(' ', trim(`hg id -nb`));
+
         if (count($result) >= 3) {
-            return self::$cache = array(
+            return self::$cache = [
                 'branch' => $result[1],
                 'revision' => $result[2],
-            );
+            ];
         }
 
-        return self::$cache = array();
+        return self::$cache = [];
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php
index 66b80fb..7851fff 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -18,11 +18,7 @@ namespace Monolog\Processor;
  */
 class ProcessIdProcessor implements ProcessorInterface
 {
-    /**
-     * @param  array $record
-     * @return array
-     */
-    public function __invoke(array $record)
+    public function __invoke(array $record): array
     {
         $record['extra']['process_id'] = getmypid();
 
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php b/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php
index 7e64d4d..9e2ded1 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -19,7 +19,7 @@ namespace Monolog\Processor;
 interface ProcessorInterface
 {
     /**
-     * @return array The processed records
+     * @return array The processed record
      */
-    public function __invoke(array $records);
+    public function __invoke(array $record);
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php
index 0088505..909fc4f 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -22,24 +22,61 @@ use Monolog\Utils;
  */
 class PsrLogMessageProcessor implements ProcessorInterface
 {
+    public const SIMPLE_DATE = "Y-m-d\TH:i:s.uP";
+
+    /** @var string|null */
+    private $dateFormat;
+
+    /** @var bool */
+    private $removeUsedContextFields;
+
+    /**
+     * @param string|null $dateFormat              The format of the timestamp: one supported by DateTime::format
+     * @param bool        $removeUsedContextFields If set to true the fields interpolated into message gets unset
+     */
+    public function __construct(?string $dateFormat = null, bool $removeUsedContextFields = false)
+    {
+        $this->dateFormat = $dateFormat;
+        $this->removeUsedContextFields = $removeUsedContextFields;
+    }
+
     /**
      * @param  array $record
      * @return array
      */
-    public function __invoke(array $record)
+    public function __invoke(array $record): array
     {
         if (false === strpos($record['message'], '{')) {
             return $record;
         }
 
-        $replacements = array();
+        $replacements = [];
         foreach ($record['context'] as $key => $val) {
+            $placeholder = '{' . $key . '}';
+            if (strpos($record['message'], $placeholder) === false) {
+                continue;
+            }
+
             if (is_null($val) || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) {
-                $replacements['{'.$key.'}'] = $val;
+                $replacements[$placeholder] = $val;
+            } elseif ($val instanceof \DateTimeInterface) {
+                if (!$this->dateFormat && $val instanceof \Monolog\DateTimeImmutable) {
+                    // handle monolog dates using __toString if no specific dateFormat was asked for
+                    // so that it follows the useMicroseconds flag
+                    $replacements[$placeholder] = (string) $val;
+                } else {
+                    $replacements[$placeholder] = $val->format($this->dateFormat ?: static::SIMPLE_DATE);
+                }
             } elseif (is_object($val)) {
-                $replacements['{'.$key.'}'] = '[object '.Utils::getClass($val).']';
+                $replacements[$placeholder] = '[object '.Utils::getClass($val).']';
+            } elseif (is_array($val)) {
+                $replacements[$placeholder] = 'array'.@json_encode($val);
             } else {
-                $replacements['{'.$key.'}'] = '['.gettype($val).']';
+                $replacements[$placeholder] = '['.gettype($val).']';
+            }
+
+            if ($this->removeUsedContextFields) {
+                unset($record['context'][$key]);
             }
         }
 
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php
index 615a4d9..199760a 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -20,22 +20,26 @@ class TagProcessor implements ProcessorInterface
 {
     private $tags;
 
-    public function __construct(array $tags = array())
+    public function __construct(array $tags = [])
     {
         $this->setTags($tags);
     }
 
-    public function addTags(array $tags = array())
+    public function addTags(array $tags = []): self
     {
         $this->tags = array_merge($this->tags, $tags);
+
+        return $this;
     }
 
-    public function setTags(array $tags = array())
+    public function setTags(array $tags = []): self
     {
         $this->tags = $tags;
+
+        return $this;
     }
 
-    public function __invoke(array $record)
+    public function __invoke(array $record): array
     {
         $record['extra']['tags'] = $this->tags;
 
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php
index d1f708c..0c97ab6 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -22,27 +22,23 @@ class UidProcessor implements ProcessorInterface, ResettableInterface
 {
     private $uid;
 
-    public function __construct($length = 7)
+    public function __construct(int $length = 7)
     {
-        if (!is_int($length) || $length > 32 || $length < 1) {
+        if ($length > 32 || $length < 1) {
             throw new \InvalidArgumentException('The uid length must be an integer between 1 and 32');
         }
 
-
         $this->uid = $this->generateUid($length);
     }
 
-    public function __invoke(array $record)
+    public function __invoke(array $record): array
     {
         $record['extra']['uid'] = $this->uid;
 
         return $record;
     }
 
-    /**
-     * @return string
-     */
-    public function getUid()
+    public function getUid(): string
     {
         return $this->uid;
     }
@@ -52,8 +48,8 @@ class UidProcessor implements ProcessorInterface, ResettableInterface
         $this->uid = $this->generateUid(strlen($this->uid));
     }
 
-    private function generateUid($length)
+    private function generateUid(int $length): string
     {
-        return substr(hash('md5', uniqid('', true)), 0, $length);
+        return substr(bin2hex(random_bytes((int) ceil($length / 2))), 0, $length);
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php
index 684188f..7b95b0e 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -30,17 +30,17 @@ class WebProcessor implements ProcessorInterface
      *
      * @var array
      */
-    protected $extraFields = array(
+    protected $extraFields = [
         'url'         => 'REQUEST_URI',
         'ip'          => 'REMOTE_ADDR',
         'http_method' => 'REQUEST_METHOD',
         'server'      => 'SERVER_NAME',
         'referrer'    => 'HTTP_REFERER',
-    );
+    ];
 
     /**
-     * @param array|\ArrayAccess $serverData  Array or object w/ ArrayAccess that provides access to the $_SERVER data
-     * @param array|null         $extraFields Field names and the related key inside $serverData to be added. If not provided it defaults to: url, ip, http_method, server, referrer
+     * @param array|\ArrayAccess|null $serverData  Array or object w/ ArrayAccess that provides access to the $_SERVER data
+     * @param array|null              $extraFields Field names and the related key inside $serverData to be added. If not provided it defaults to: url, ip, http_method, server, referrer
      */
     public function __construct($serverData = null, array $extraFields = null)
     {
@@ -65,11 +65,7 @@ class WebProcessor implements ProcessorInterface
         }
     }
 
-    /**
-     * @param  array $record
-     * @return array
-     */
-    public function __invoke(array $record)
+    public function __invoke(array $record): array
     {
         // skip processing if for some reason request data
         // is not present (CLI or wonky SAPIs)
@@ -82,26 +78,17 @@ class WebProcessor implements ProcessorInterface
         return $record;
     }
 
-    /**
-     * @param  string $extraName
-     * @param  string $serverName
-     * @return $this
-     */
-    public function addExtraField($extraName, $serverName)
+    public function addExtraField(string $extraName, string $serverName): self
     {
         $this->extraFields[$extraName] = $serverName;
 
         return $this;
     }
 
-    /**
-     * @param  array $extra
-     * @return array
-     */
-    private function appendExtraFields(array $extra)
+    private function appendExtraFields(array $extra): array
     {
         foreach ($this->extraFields as $extraName => $serverName) {
-            $extra[$extraName] = isset($this->serverData[$serverName]) ? $this->serverData[$serverName] : null;
+            $extra[$extraName] = $this->serverData[$serverName] ?? null;
         }
 
         if (isset($this->serverData['UNIQUE_ID'])) {
diff --git a/vendor/monolog/monolog/src/Monolog/Registry.php b/vendor/monolog/monolog/src/Monolog/Registry.php
index 159b751..78fb97e 100644
--- a/vendor/monolog/monolog/src/Monolog/Registry.php
+++ b/vendor/monolog/monolog/src/Monolog/Registry.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -28,8 +28,8 @@ use InvalidArgumentException;
  *
  * function testLogger()
  * {
- *     Monolog\Registry::api()->addError('Sent to $api Logger instance');
- *     Monolog\Registry::application()->addError('Sent to $application Logger instance');
+ *     Monolog\Registry::api()->error('Sent to $api Logger instance');
+ *     Monolog\Registry::application()->error('Sent to $application Logger instance');
  * }
  * </code>
  *
@@ -42,7 +42,7 @@ class Registry
      *
      * @var Logger[]
      */
-    private static $loggers = array();
+    private static $loggers = [];
 
     /**
      * Adds new logging channel to the registry
@@ -52,7 +52,7 @@ class Registry
      * @param  bool                      $overwrite Overwrite instance in the registry if the given name already exists?
      * @throws \InvalidArgumentException If $overwrite set to false and named Logger instance already exists
      */
-    public static function addLogger(Logger $logger, $name = null, $overwrite = false)
+    public static function addLogger(Logger $logger, ?string $name = null, bool $overwrite = false)
     {
         $name = $name ?: $logger->getName();
 
@@ -68,15 +68,15 @@ class Registry
      *
      * @param string|Logger $logger Name or logger instance
      */
-    public static function hasLogger($logger)
+    public static function hasLogger($logger): bool
     {
         if ($logger instanceof Logger) {
             $index = array_search($logger, self::$loggers, true);
 
             return false !== $index;
-        } else {
-            return isset(self::$loggers[$logger]);
         }
+
+        return isset(self::$loggers[$logger]);
     }
 
     /**
@@ -84,7 +84,7 @@ class Registry
      *
      * @param string|Logger $logger Name or logger instance
      */
-    public static function removeLogger($logger)
+    public static function removeLogger($logger): void
     {
         if ($logger instanceof Logger) {
             if (false !== ($idx = array_search($logger, self::$loggers, true))) {
@@ -98,9 +98,9 @@ class Registry
     /**
      * Clears the registry
      */
-    public static function clear()
+    public static function clear(): void
     {
-        self::$loggers = array();
+        self::$loggers = [];
     }
 
     /**
@@ -108,9 +108,8 @@ class Registry
      *
      * @param  string                    $name Name of the requested Logger instance
      * @throws \InvalidArgumentException If named Logger instance is not in the registry
-     * @return Logger                    Requested instance of Logger
      */
-    public static function getInstance($name)
+    public static function getInstance($name): Logger
     {
         if (!isset(self::$loggers[$name])) {
             throw new InvalidArgumentException(sprintf('Requested "%s" logger instance is not in the registry', $name));
diff --git a/vendor/monolog/monolog/src/Monolog/ResettableInterface.php b/vendor/monolog/monolog/src/Monolog/ResettableInterface.php
index 635bc77..2c5fd78 100644
--- a/vendor/monolog/monolog/src/Monolog/ResettableInterface.php
+++ b/vendor/monolog/monolog/src/Monolog/ResettableInterface.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -27,5 +27,8 @@ namespace Monolog;
  */
 interface ResettableInterface
 {
+    /**
+     * @return void
+     */
     public function reset();
 }
diff --git a/vendor/monolog/monolog/src/Monolog/SignalHandler.php b/vendor/monolog/monolog/src/Monolog/SignalHandler.php
index d590780..4a79fe6 100644
--- a/vendor/monolog/monolog/src/Monolog/SignalHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/SignalHandler.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -24,69 +24,59 @@ class SignalHandler
 {
     private $logger;
 
-    private $previousSignalHandler = array();
-    private $signalLevelMap = array();
-    private $signalRestartSyscalls = array();
+    private $previousSignalHandler = [];
+    private $signalLevelMap = [];
+    private $signalRestartSyscalls = [];
 
     public function __construct(LoggerInterface $logger)
     {
         $this->logger = $logger;
     }
 
-    public function registerSignalHandler($signo, $level = LogLevel::CRITICAL, $callPrevious = true, $restartSyscalls = true, $async = true)
+    public function registerSignalHandler($signo, $level = LogLevel::CRITICAL, bool $callPrevious = true, bool $restartSyscalls = true, ?bool $async = true): self
     {
         if (!extension_loaded('pcntl') || !function_exists('pcntl_signal')) {
             return $this;
         }
 
         if ($callPrevious) {
-            if (function_exists('pcntl_signal_get_handler')) {
-                $handler = pcntl_signal_get_handler($signo);
-                if ($handler === false) {
-                    return $this;
-                }
-                $this->previousSignalHandler[$signo] = $handler;
-            } else {
-                $this->previousSignalHandler[$signo] = true;
+            $handler = pcntl_signal_get_handler($signo);
+            if ($handler === false) {
+                return $this;
             }
+            $this->previousSignalHandler[$signo] = $handler;
         } else {
             unset($this->previousSignalHandler[$signo]);
         }
         $this->signalLevelMap[$signo] = $level;
         $this->signalRestartSyscalls[$signo] = $restartSyscalls;
 
-        if (function_exists('pcntl_async_signals') && $async !== null) {
+        if ($async !== null) {
             pcntl_async_signals($async);
         }
 
-        pcntl_signal($signo, array($this, 'handleSignal'), $restartSyscalls);
+        pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls);
 
         return $this;
     }
 
-    public function handleSignal($signo, array $siginfo = null)
+    public function handleSignal($signo, array $siginfo = null): void
     {
-        static $signals = array();
+        static $signals = [];
 
         if (!$signals && extension_loaded('pcntl')) {
             $pcntl = new ReflectionExtension('pcntl');
-            $constants = $pcntl->getConstants();
-            if (!$constants) {
-                // HHVM 3.24.2 returns an empty array.
-                $constants = get_defined_constants(true);
-                $constants = $constants['Core'];
-            }
-            foreach ($constants as $name => $value) {
+            // HHVM 3.24.2 returns an empty array.
+            foreach ($pcntl->getConstants() ?: get_defined_constants(true)['Core'] as $name => $value) {
                 if (substr($name, 0, 3) === 'SIG' && $name[3] !== '_' && is_int($value)) {
                     $signals[$value] = $name;
                 }
             }
-            unset($constants);
         }
 
-        $level = isset($this->signalLevelMap[$signo]) ? $this->signalLevelMap[$signo] : LogLevel::CRITICAL;
-        $signal = isset($signals[$signo]) ? $signals[$signo] : $signo;
-        $context = isset($siginfo) ? $siginfo : array();
+        $level = $this->signalLevelMap[$signo] ?? LogLevel::CRITICAL;
+        $signal = $signals[$signo] ?? $signo;
+        $context = $siginfo ?? [];
         $this->logger->log($level, sprintf('Program received signal %s', $signal), $context);
 
         if (!isset($this->previousSignalHandler[$signo])) {
@@ -95,21 +85,18 @@ class SignalHandler
 
         if ($this->previousSignalHandler[$signo] === true || $this->previousSignalHandler[$signo] === SIG_DFL) {
             if (extension_loaded('pcntl') && function_exists('pcntl_signal') && function_exists('pcntl_sigprocmask') && function_exists('pcntl_signal_dispatch')
-                && extension_loaded('posix') && function_exists('posix_getpid') && function_exists('posix_kill')) {
-                    $restartSyscalls = isset($this->restartSyscalls[$signo]) ? $this->restartSyscalls[$signo] : true;
-                    pcntl_signal($signo, SIG_DFL, $restartSyscalls);
-                    pcntl_sigprocmask(SIG_UNBLOCK, array($signo), $oldset);
-                    posix_kill(posix_getpid(), $signo);
-                    pcntl_signal_dispatch();
-                    pcntl_sigprocmask(SIG_SETMASK, $oldset);
-                    pcntl_signal($signo, array($this, 'handleSignal'), $restartSyscalls);
-                }
-        } elseif (is_callable($this->previousSignalHandler[$signo])) {
-            if (PHP_VERSION_ID >= 70100) {
-                $this->previousSignalHandler[$signo]($signo, $siginfo);
-            } else {
-                $this->previousSignalHandler[$signo]($signo);
+                && extension_loaded('posix') && function_exists('posix_getpid') && function_exists('posix_kill')
+            ) {
+                $restartSyscalls = $this->signalRestartSyscalls[$signo] ?? true;
+                pcntl_signal($signo, SIG_DFL, $restartSyscalls);
+                pcntl_sigprocmask(SIG_UNBLOCK, [$signo], $oldset);
+                posix_kill(posix_getpid(), $signo);
+                pcntl_signal_dispatch();
+                pcntl_sigprocmask(SIG_SETMASK, $oldset);
+                pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls);
             }
+        } elseif (is_callable($this->previousSignalHandler[$signo])) {
+            $this->previousSignalHandler[$signo]($signo, $siginfo);
         }
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Utils.php b/vendor/monolog/monolog/src/Monolog/Utils.php
index eb9be86..358087c 100644
--- a/vendor/monolog/monolog/src/Monolog/Utils.php
+++ b/vendor/monolog/monolog/src/Monolog/Utils.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
 
 /*
  * This file is part of the Monolog package.
@@ -11,15 +11,161 @@
 
 namespace Monolog;
 
-class Utils
+final class Utils
 {
+    const DEFAULT_JSON_FLAGS = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION;
+
     /**
      * @internal
      */
-    public static function getClass($object)
+    public static function getClass($object): string
     {
         $class = \get_class($object);
 
         return 'c' === $class[0] && 0 === strpos($class, "class@anonymous\0") ? get_parent_class($class).'@anonymous' : $class;
     }
+
+    public static function substr(string $string, int $start, ?int $length = null)
+    {
+        if (extension_loaded('mbstring')) {
+            return mb_strcut($string, $start, $length);
+        }
+
+        return substr($string, $start, $length);
+    }
+
+    /**
+     * Return the JSON representation of a value
+     *
+     * @param  mixed             $data
+     * @param  int               $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE
+     * @param  bool              $ignoreErrors whether to ignore encoding errors or to throw on error, when ignored and the encoding fails, "null" is returned which is valid json for null
+     * @throws \RuntimeException if encoding fails and errors are not ignored
+     * @return string when errors are ignored and the encoding fails, "null" is returned which is valid json for null
+     */
+    public static function jsonEncode($data, ?int $encodeFlags = null, bool $ignoreErrors = false): string
+    {
+        if (null === $encodeFlags) {
+            $encodeFlags = self::DEFAULT_JSON_FLAGS;
+        }
+
+        if ($ignoreErrors) {
+            $json = @json_encode($data, $encodeFlags);
+            if (false === $json) {
+                return 'null';
+            }
+
+            return $json;
+        }
+
+        $json = json_encode($data, $encodeFlags);
+        if (false === $json) {
+            $json = self::handleJsonError(json_last_error(), $data);
+        }
+
+        return $json;
+    }
+
+    /**
+     * Handle a json_encode failure.
+     *
+     * If the failure is due to invalid string encoding, try to clean the
+     * input and encode again. If the second encoding attempt fails, the
+     * inital error is not encoding related or the input can't be cleaned then
+     * raise a descriptive exception.
+     *
+     * @param  int               $code return code of json_last_error function
+     * @param  mixed             $data data that was meant to be encoded
+     * @param  int               $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION
+     * @throws \RuntimeException if failure can't be corrected
+     * @return string            JSON encoded data after error correction
+     */
+    public static function handleJsonError(int $code, $data, ?int $encodeFlags = null): string
+    {
+        if ($code !== JSON_ERROR_UTF8) {
+            self::throwEncodeError($code, $data);
+        }
+
+        if (is_string($data)) {
+            self::detectAndCleanUtf8($data);
+        } elseif (is_array($data)) {
+            array_walk_recursive($data, array('Monolog\Utils', 'detectAndCleanUtf8'));
+        } else {
+            self::throwEncodeError($code, $data);
+        }
+
+        if (null === $encodeFlags) {
+            $encodeFlags = self::DEFAULT_JSON_FLAGS;
+        }
+
+        $json = json_encode($data, $encodeFlags);
+
+        if ($json === false) {
+            self::throwEncodeError(json_last_error(), $data);
+        }
+
+        return $json;
+    }
+
+    /**
+     * Throws an exception according to a given code with a customized message
+     *
+     * @param  int               $code return code of json_last_error function
+     * @param  mixed             $data data that was meant to be encoded
+     * @throws \RuntimeException
+     */
+    private static function throwEncodeError(int $code, $data)
+    {
+        switch ($code) {
+            case JSON_ERROR_DEPTH:
+                $msg = 'Maximum stack depth exceeded';
+                break;
+            case JSON_ERROR_STATE_MISMATCH:
+                $msg = 'Underflow or the modes mismatch';
+                break;
+            case JSON_ERROR_CTRL_CHAR:
+                $msg = 'Unexpected control character found';
+                break;
+            case JSON_ERROR_UTF8:
+                $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded';
+                break;
+            default:
+                $msg = 'Unknown error';
+        }
+
+        throw new \RuntimeException('JSON encoding failed: '.$msg.'. Encoding: '.var_export($data, true));
+    }
+
+    /**
+     * Detect invalid UTF-8 string characters and convert to valid UTF-8.
+     *
+     * Valid UTF-8 input will be left unmodified, but strings containing
+     * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed
+     * original encoding of ISO-8859-15. This conversion may result in
+     * incorrect output if the actual encoding was not ISO-8859-15, but it
+     * will be clean UTF-8 output and will not rely on expensive and fragile
+     * detection algorithms.
+     *
+     * Function converts the input in place in the passed variable so that it
+     * can be used as a callback for array_walk_recursive.
+     *
+     * @param mixed &$data Input to check and convert if needed
+     */
+    private static function detectAndCleanUtf8(&$data)
+    {
+        if (is_string($data) && !preg_match('//u', $data)) {
+            $data = preg_replace_callback(
+                '/[\x80-\xFF]+/',
+                function ($m) {
+                    return utf8_encode($m[0]);
+                },
+                $data
+            );
+            $data = str_replace(
+                ['¤', '¦', '¨', '´', '¸', '¼', '½', '¾'],
+                ['€', 'Š', 'š', 'Ž', 'ž', 'Œ', 'œ', 'Ÿ'],
+                $data
+            );
+        }
+    }
 }
diff --git a/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php
deleted file mode 100644
index a9a3f30..0000000
--- a/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog;
-
-use Monolog\Handler\TestHandler;
-
-class ErrorHandlerTest extends \PHPUnit_Framework_TestCase
-{
-    public function testHandleError()
-    {
-        $logger = new Logger('test', array($handler = new TestHandler));
-        $errHandler = new ErrorHandler($logger);
-
-        $errHandler->registerErrorHandler(array(E_USER_NOTICE => Logger::EMERGENCY), false);
-        trigger_error('Foo', E_USER_ERROR);
-        $this->assertCount(1, $handler->getRecords());
-        $this->assertTrue($handler->hasErrorRecords());
-        trigger_error('Foo', E_USER_NOTICE);
-        $this->assertCount(2, $handler->getRecords());
-        $this->assertTrue($handler->hasEmergencyRecords());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php
deleted file mode 100644
index 71c4204..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php
+++ /dev/null
@@ -1,158 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-use Monolog\Logger;
-
-class ChromePHPFormatterTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @covers Monolog\Formatter\ChromePHPFormatter::format
-     */
-    public function testDefaultFormat()
-    {
-        $formatter = new ChromePHPFormatter();
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('ip' => '127.0.0.1'),
-            'message' => 'log',
-        );
-
-        $message = $formatter->format($record);
-
-        $this->assertEquals(
-            array(
-                'meh',
-                array(
-                    'message' => 'log',
-                    'context' => array('from' => 'logger'),
-                    'extra' => array('ip' => '127.0.0.1'),
-                ),
-                'unknown',
-                'error',
-            ),
-            $message
-        );
-    }
-
-    /**
-     * @covers Monolog\Formatter\ChromePHPFormatter::format
-     */
-    public function testFormatWithFileAndLine()
-    {
-        $formatter = new ChromePHPFormatter();
-        $record = array(
-            'level' => Logger::CRITICAL,
-            'level_name' => 'CRITICAL',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('ip' => '127.0.0.1', 'file' => 'test', 'line' => 14),
-            'message' => 'log',
-        );
-
-        $message = $formatter->format($record);
-
-        $this->assertEquals(
-            array(
-                'meh',
-                array(
-                    'message' => 'log',
-                    'context' => array('from' => 'logger'),
-                    'extra' => array('ip' => '127.0.0.1'),
-                ),
-                'test : 14',
-                'error',
-            ),
-            $message
-        );
-    }
-
-    /**
-     * @covers Monolog\Formatter\ChromePHPFormatter::format
-     */
-    public function testFormatWithoutContext()
-    {
-        $formatter = new ChromePHPFormatter();
-        $record = array(
-            'level' => Logger::DEBUG,
-            'level_name' => 'DEBUG',
-            'channel' => 'meh',
-            'context' => array(),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array(),
-            'message' => 'log',
-        );
-
-        $message = $formatter->format($record);
-
-        $this->assertEquals(
-            array(
-                'meh',
-                'log',
-                'unknown',
-                'log',
-            ),
-            $message
-        );
-    }
-
-    /**
-     * @covers Monolog\Formatter\ChromePHPFormatter::formatBatch
-     */
-    public function testBatchFormatThrowException()
-    {
-        $formatter = new ChromePHPFormatter();
-        $records = array(
-            array(
-                'level' => Logger::INFO,
-                'level_name' => 'INFO',
-                'channel' => 'meh',
-                'context' => array(),
-                'datetime' => new \DateTime("@0"),
-                'extra' => array(),
-                'message' => 'log',
-            ),
-            array(
-                'level' => Logger::WARNING,
-                'level_name' => 'WARNING',
-                'channel' => 'foo',
-                'context' => array(),
-                'datetime' => new \DateTime("@0"),
-                'extra' => array(),
-                'message' => 'log2',
-            ),
-        );
-
-        $this->assertEquals(
-            array(
-                array(
-                    'meh',
-                    'log',
-                    'unknown',
-                    'info',
-                ),
-                array(
-                    'foo',
-                    'log2',
-                    'unknown',
-                    'warn',
-                ),
-            ),
-            $formatter->formatBatch($records)
-        );
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php
deleted file mode 100644
index 90cc48d..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-use Monolog\Logger;
-
-class ElasticaFormatterTest extends \PHPUnit_Framework_TestCase
-{
-    public function setUp()
-    {
-        if (!class_exists("Elastica\Document")) {
-            $this->markTestSkipped("ruflin/elastica not installed");
-        }
-    }
-
-    /**
-     * @covers Monolog\Formatter\ElasticaFormatter::__construct
-     * @covers Monolog\Formatter\ElasticaFormatter::format
-     * @covers Monolog\Formatter\ElasticaFormatter::getDocument
-     */
-    public function testFormat()
-    {
-        // test log message
-        $msg = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('foo' => 7, 'bar', 'class' => new \stdClass),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array(),
-            'message' => 'log',
-        );
-
-        // expected values
-        $expected = $msg;
-        $expected['datetime'] = '1970-01-01T00:00:00.000000+00:00';
-        $expected['context'] = array(
-            'class' => '[object] (stdClass: {})',
-            'foo' => 7,
-            0 => 'bar',
-        );
-
-        // format log message
-        $formatter = new ElasticaFormatter('my_index', 'doc_type');
-        $doc = $formatter->format($msg);
-        $this->assertInstanceOf('Elastica\Document', $doc);
-
-        // Document parameters
-        $params = $doc->getParams();
-        $this->assertEquals('my_index', $params['_index']);
-        $this->assertEquals('doc_type', $params['_type']);
-
-        // Document data values
-        $data = $doc->getData();
-        foreach (array_keys($expected) as $key) {
-            $this->assertEquals($expected[$key], $data[$key]);
-        }
-    }
-
-    /**
-     * @covers Monolog\Formatter\ElasticaFormatter::getIndex
-     * @covers Monolog\Formatter\ElasticaFormatter::getType
-     */
-    public function testGetters()
-    {
-        $formatter = new ElasticaFormatter('my_index', 'doc_type');
-        $this->assertEquals('my_index', $formatter->getIndex());
-        $this->assertEquals('doc_type', $formatter->getType());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/FlowdockFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/FlowdockFormatterTest.php
deleted file mode 100644
index 1b2fd97..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/FlowdockFormatterTest.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-use Monolog\Logger;
-use Monolog\TestCase;
-
-class FlowdockFormatterTest extends TestCase
-{
-    /**
-     * @covers Monolog\Formatter\FlowdockFormatter::format
-     */
-    public function testFormat()
-    {
-        $formatter = new FlowdockFormatter('test_source', 'source@test.com');
-        $record = $this->getRecord();
-
-        $expected = array(
-            'source' => 'test_source',
-            'from_address' => 'source@test.com',
-            'subject' => 'in test_source: WARNING - test',
-            'content' => 'test',
-            'tags' => array('#logs', '#warning', '#test'),
-            'project' => 'test_source',
-        );
-        $formatted = $formatter->format($record);
-
-        $this->assertEquals($expected, $formatted['flowdock']);
-    }
-
-    /**
-     * @ covers Monolog\Formatter\FlowdockFormatter::formatBatch
-     */
-    public function testFormatBatch()
-    {
-        $formatter = new FlowdockFormatter('test_source', 'source@test.com');
-        $records = array(
-            $this->getRecord(Logger::WARNING),
-            $this->getRecord(Logger::DEBUG),
-        );
-        $formatted = $formatter->formatBatch($records);
-
-        $this->assertArrayHasKey('flowdock', $formatted[0]);
-        $this->assertArrayHasKey('flowdock', $formatted[1]);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php
deleted file mode 100644
index fd36dbc..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-use Monolog\Logger;
-use Monolog\TestCase;
-
-class FluentdFormatterTest extends TestCase
-{
-    /**
-     * @covers Monolog\Formatter\FluentdFormatter::__construct
-     * @covers Monolog\Formatter\FluentdFormatter::isUsingLevelsInTag
-     */
-    public function testConstruct()
-    {
-        $formatter = new FluentdFormatter();
-        $this->assertEquals(false, $formatter->isUsingLevelsInTag());
-        $formatter = new FluentdFormatter(false);
-        $this->assertEquals(false, $formatter->isUsingLevelsInTag());
-        $formatter = new FluentdFormatter(true);
-        $this->assertEquals(true, $formatter->isUsingLevelsInTag());
-    }
-
-    /**
-     * @covers Monolog\Formatter\FluentdFormatter::format
-     */
-    public function testFormat()
-    {
-        $record = $this->getRecord(Logger::WARNING);
-        $record['datetime'] = new \DateTime("@0");
-
-        $formatter = new FluentdFormatter();
-        $this->assertEquals(
-            '["test",0,{"message":"test","context":[],"extra":[],"level":300,"level_name":"WARNING"}]',
-            $formatter->format($record)
-        );
-    }
-
-    /**
-     * @covers Monolog\Formatter\FluentdFormatter::format
-     */
-    public function testFormatWithTag()
-    {
-        $record = $this->getRecord(Logger::ERROR);
-        $record['datetime'] = new \DateTime("@0");
-
-        $formatter = new FluentdFormatter(true);
-        $this->assertEquals(
-            '["test.error",0,{"message":"test","context":[],"extra":[]}]',
-            $formatter->format($record)
-        );
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php
deleted file mode 100644
index 4a24761..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php
+++ /dev/null
@@ -1,258 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-use Monolog\Logger;
-
-class GelfMessageFormatterTest extends \PHPUnit_Framework_TestCase
-{
-    public function setUp()
-    {
-        if (!class_exists('\Gelf\Message')) {
-            $this->markTestSkipped("graylog2/gelf-php or mlehner/gelf-php is not installed");
-        }
-    }
-
-    /**
-     * @covers Monolog\Formatter\GelfMessageFormatter::format
-     */
-    public function testDefaultFormatter()
-    {
-        $formatter = new GelfMessageFormatter();
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array(),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array(),
-            'message' => 'log',
-        );
-
-        $message = $formatter->format($record);
-
-        $this->assertInstanceOf('Gelf\Message', $message);
-        $this->assertEquals(0, $message->getTimestamp());
-        $this->assertEquals('log', $message->getShortMessage());
-        $this->assertEquals('meh', $message->getFacility());
-        $this->assertEquals(null, $message->getLine());
-        $this->assertEquals(null, $message->getFile());
-        $this->assertEquals($this->isLegacy() ? 3 : 'error', $message->getLevel());
-        $this->assertNotEmpty($message->getHost());
-
-        $formatter = new GelfMessageFormatter('mysystem');
-
-        $message = $formatter->format($record);
-
-        $this->assertInstanceOf('Gelf\Message', $message);
-        $this->assertEquals('mysystem', $message->getHost());
-    }
-
-    /**
-     * @covers Monolog\Formatter\GelfMessageFormatter::format
-     */
-    public function testFormatWithFileAndLine()
-    {
-        $formatter = new GelfMessageFormatter();
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('file' => 'test', 'line' => 14),
-            'message' => 'log',
-        );
-
-        $message = $formatter->format($record);
-
-        $this->assertInstanceOf('Gelf\Message', $message);
-        $this->assertEquals('test', $message->getFile());
-        $this->assertEquals(14, $message->getLine());
-    }
-
-    /**
-     * @covers Monolog\Formatter\GelfMessageFormatter::format
-     * @expectedException InvalidArgumentException
-     */
-    public function testFormatInvalidFails()
-    {
-        $formatter = new GelfMessageFormatter();
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-        );
-
-        $formatter->format($record);
-    }
-
-    /**
-     * @covers Monolog\Formatter\GelfMessageFormatter::format
-     */
-    public function testFormatWithContext()
-    {
-        $formatter = new GelfMessageFormatter();
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('key' => 'pair'),
-            'message' => 'log',
-        );
-
-        $message = $formatter->format($record);
-
-        $this->assertInstanceOf('Gelf\Message', $message);
-
-        $message_array = $message->toArray();
-
-        $this->assertArrayHasKey('_ctxt_from', $message_array);
-        $this->assertEquals('logger', $message_array['_ctxt_from']);
-
-        // Test with extraPrefix
-        $formatter = new GelfMessageFormatter(null, null, 'CTX');
-        $message = $formatter->format($record);
-
-        $this->assertInstanceOf('Gelf\Message', $message);
-
-        $message_array = $message->toArray();
-
-        $this->assertArrayHasKey('_CTXfrom', $message_array);
-        $this->assertEquals('logger', $message_array['_CTXfrom']);
-    }
-
-    /**
-     * @covers Monolog\Formatter\GelfMessageFormatter::format
-     */
-    public function testFormatWithContextContainingException()
-    {
-        $formatter = new GelfMessageFormatter();
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger', 'exception' => array(
-                'class' => '\Exception',
-                'file'  => '/some/file/in/dir.php:56',
-                'trace' => array('/some/file/1.php:23', '/some/file/2.php:3'),
-            )),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array(),
-            'message' => 'log',
-        );
-
-        $message = $formatter->format($record);
-
-        $this->assertInstanceOf('Gelf\Message', $message);
-
-        $this->assertEquals("/some/file/in/dir.php", $message->getFile());
-        $this->assertEquals("56", $message->getLine());
-    }
-
-    /**
-     * @covers Monolog\Formatter\GelfMessageFormatter::format
-     */
-    public function testFormatWithExtra()
-    {
-        $formatter = new GelfMessageFormatter();
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('key' => 'pair'),
-            'message' => 'log',
-        );
-
-        $message = $formatter->format($record);
-
-        $this->assertInstanceOf('Gelf\Message', $message);
-
-        $message_array = $message->toArray();
-
-        $this->assertArrayHasKey('_key', $message_array);
-        $this->assertEquals('pair', $message_array['_key']);
-
-        // Test with extraPrefix
-        $formatter = new GelfMessageFormatter(null, 'EXT');
-        $message = $formatter->format($record);
-
-        $this->assertInstanceOf('Gelf\Message', $message);
-
-        $message_array = $message->toArray();
-
-        $this->assertArrayHasKey('_EXTkey', $message_array);
-        $this->assertEquals('pair', $message_array['_EXTkey']);
-    }
-
-    public function testFormatWithLargeData()
-    {
-        $formatter = new GelfMessageFormatter();
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('exception' => str_repeat(' ', 32767)),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('key' => str_repeat(' ', 32767)),
-            'message' => 'log'
-        );
-        $message = $formatter->format($record);
-        $messageArray = $message->toArray();
-
-        // 200 for padding + metadata
-        $length = 200;
-
-        foreach ($messageArray as $key => $value) {
-            if (!in_array($key, array('level', 'timestamp'))) {
-                $length += strlen($value);
-            }
-        }
-
-        $this->assertLessThanOrEqual(65792, $length, 'The message length is no longer than the maximum allowed length');
-    }
-
-    public function testFormatWithUnlimitedLength()
-    {
-        $formatter = new GelfMessageFormatter('LONG_SYSTEM_NAME', null, 'ctxt_', PHP_INT_MAX);
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('exception' => str_repeat(' ', 32767 * 2)),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('key' => str_repeat(' ', 32767 * 2)),
-            'message' => 'log'
-        );
-        $message = $formatter->format($record);
-        $messageArray = $message->toArray();
-
-        // 200 for padding + metadata
-        $length = 200;
-
-        foreach ($messageArray as $key => $value) {
-            if (!in_array($key, array('level', 'timestamp'))) {
-                $length += strlen($value);
-            }
-        }
-
-        $this->assertGreaterThanOrEqual(131289, $length, 'The message should not be truncated');
-    }
-
-    private function isLegacy()
-    {
-        return interface_exists('\Gelf\IMessagePublisher');
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php
deleted file mode 100644
index 24b06cc..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php
+++ /dev/null
@@ -1,219 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-use Monolog\Logger;
-use Monolog\TestCase;
-
-class JsonFormatterTest extends TestCase
-{
-    /**
-     * @covers Monolog\Formatter\JsonFormatter::__construct
-     * @covers Monolog\Formatter\JsonFormatter::getBatchMode
-     * @covers Monolog\Formatter\JsonFormatter::isAppendingNewlines
-     */
-    public function testConstruct()
-    {
-        $formatter = new JsonFormatter();
-        $this->assertEquals(JsonFormatter::BATCH_MODE_JSON, $formatter->getBatchMode());
-        $this->assertEquals(true, $formatter->isAppendingNewlines());
-        $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES, false);
-        $this->assertEquals(JsonFormatter::BATCH_MODE_NEWLINES, $formatter->getBatchMode());
-        $this->assertEquals(false, $formatter->isAppendingNewlines());
-    }
-
-    /**
-     * @covers Monolog\Formatter\JsonFormatter::format
-     */
-    public function testFormat()
-    {
-        $formatter = new JsonFormatter();
-        $record = $this->getRecord();
-        $this->assertEquals(json_encode($record)."\n", $formatter->format($record));
-
-        $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false);
-        $record = $this->getRecord();
-        $this->assertEquals(json_encode($record), $formatter->format($record));
-    }
-
-    /**
-     * @covers Monolog\Formatter\JsonFormatter::formatBatch
-     * @covers Monolog\Formatter\JsonFormatter::formatBatchJson
-     */
-    public function testFormatBatch()
-    {
-        $formatter = new JsonFormatter();
-        $records = array(
-            $this->getRecord(Logger::WARNING),
-            $this->getRecord(Logger::DEBUG),
-        );
-        $this->assertEquals(json_encode($records), $formatter->formatBatch($records));
-    }
-
-    /**
-     * @covers Monolog\Formatter\JsonFormatter::formatBatch
-     * @covers Monolog\Formatter\JsonFormatter::formatBatchNewlines
-     */
-    public function testFormatBatchNewlines()
-    {
-        $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES);
-        $records = $expected = array(
-            $this->getRecord(Logger::WARNING),
-            $this->getRecord(Logger::DEBUG),
-        );
-        array_walk($expected, function (&$value, $key) {
-            $value = json_encode($value);
-        });
-        $this->assertEquals(implode("\n", $expected), $formatter->formatBatch($records));
-    }
-
-    public function testDefFormatWithException()
-    {
-        $formatter = new JsonFormatter();
-        $exception = new \RuntimeException('Foo');
-        $formattedException = $this->formatException($exception);
-
-        $message = $this->formatRecordWithExceptionInContext($formatter, $exception);
-
-        $this->assertContextContainsFormattedException($formattedException, $message);
-    }
-
-    public function testDefFormatWithPreviousException()
-    {
-        $formatter = new JsonFormatter();
-        $exception = new \RuntimeException('Foo', 0, new \LogicException('Wut?'));
-        $formattedPrevException = $this->formatException($exception->getPrevious());
-        $formattedException = $this->formatException($exception, $formattedPrevException);
-
-        $message = $this->formatRecordWithExceptionInContext($formatter, $exception);
-
-        $this->assertContextContainsFormattedException($formattedException, $message);
-    }
-
-    public function testDefFormatWithThrowable()
-    {
-        if (!class_exists('Error') || !is_subclass_of('Error', 'Throwable')) {
-            $this->markTestSkipped('Requires PHP >=7');
-        }
-
-        $formatter = new JsonFormatter();
-        $throwable = new \Error('Foo');
-        $formattedThrowable = $this->formatException($throwable);
-
-        $message = $this->formatRecordWithExceptionInContext($formatter, $throwable);
-
-        $this->assertContextContainsFormattedException($formattedThrowable, $message);
-    }
-
-    /**
-     * @param string $expected
-     * @param string $actual
-     *
-     * @internal param string $exception
-     */
-    private function assertContextContainsFormattedException($expected, $actual)
-    {
-        $this->assertEquals(
-            '{"level_name":"CRITICAL","channel":"core","context":{"exception":'.$expected.'},"datetime":null,"extra":[],"message":"foobar"}'."\n",
-            $actual
-        );
-    }
-
-    /**
-     * @param JsonFormatter $formatter
-     * @param \Exception|\Throwable $exception
-     *
-     * @return string
-     */
-    private function formatRecordWithExceptionInContext(JsonFormatter $formatter, $exception)
-    {
-        $message = $formatter->format(array(
-            'level_name' => 'CRITICAL',
-            'channel' => 'core',
-            'context' => array('exception' => $exception),
-            'datetime' => null,
-            'extra' => array(),
-            'message' => 'foobar',
-        ));
-        return $message;
-    }
-
-    /**
-     * @param \Exception|\Throwable $exception
-     *
-     * @return string
-     */
-    private function formatExceptionFilePathWithLine($exception)
-    {
-        $options = 0;
-        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
-            $options = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
-        }
-        $path = substr(json_encode($exception->getFile(), $options), 1, -1);
-        return $path . ':' . $exception->getLine();
-    }
-
-    /**
-     * @param \Exception|\Throwable $exception
-     *
-     * @param null|string $previous
-     *
-     * @return string
-     */
-    private function formatException($exception, $previous = null)
-    {
-        $formattedException =
-            '{"class":"' . get_class($exception) .
-            '","message":"' . $exception->getMessage() .
-            '","code":' . $exception->getCode() .
-            ',"file":"' . $this->formatExceptionFilePathWithLine($exception) .
-            ($previous ? '","previous":' . $previous : '"') .
-            '}';
-        return $formattedException;
-    }
-
-    public function testNormalizeHandleLargeArraysWithExactly1000Items()
-    {
-        $formatter = new NormalizerFormatter();
-        $largeArray = range(1, 1000);
-
-        $res = $formatter->format(array(
-            'level_name' => 'CRITICAL',
-            'channel' => 'test',
-            'message' => 'bar',
-            'context' => array($largeArray),
-            'datetime' => new \DateTime,
-            'extra' => array(),
-        ));
-
-        $this->assertCount(1000, $res['context'][0]);
-        $this->assertArrayNotHasKey('...', $res['context'][0]);
-    }
-
-    public function testNormalizeHandleLargeArrays()
-    {
-        $formatter = new NormalizerFormatter();
-        $largeArray = range(1, 2000);
-
-        $res = $formatter->format(array(
-            'level_name' => 'CRITICAL',
-            'channel' => 'test',
-            'message' => 'bar',
-            'context' => array($largeArray),
-            'datetime' => new \DateTime,
-            'extra' => array(),
-        ));
-
-        $this->assertCount(1001, $res['context'][0]);
-        $this->assertEquals('Over 1000 items (2000 total), aborting normalization', $res['context'][0]['...']);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php
deleted file mode 100644
index 310d93c..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php
+++ /dev/null
@@ -1,222 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-/**
- * @covers Monolog\Formatter\LineFormatter
- */
-class LineFormatterTest extends \PHPUnit_Framework_TestCase
-{
-    public function testDefFormatWithString()
-    {
-        $formatter = new LineFormatter(null, 'Y-m-d');
-        $message = $formatter->format(array(
-            'level_name' => 'WARNING',
-            'channel' => 'log',
-            'context' => array(),
-            'message' => 'foo',
-            'datetime' => new \DateTime,
-            'extra' => array(),
-        ));
-        $this->assertEquals('['.date('Y-m-d').'] log.WARNING: foo [] []'."\n", $message);
-    }
-
-    public function testDefFormatWithArrayContext()
-    {
-        $formatter = new LineFormatter(null, 'Y-m-d');
-        $message = $formatter->format(array(
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'message' => 'foo',
-            'datetime' => new \DateTime,
-            'extra' => array(),
-            'context' => array(
-                'foo' => 'bar',
-                'baz' => 'qux',
-                'bool' => false,
-                'null' => null,
-            ),
-        ));
-        $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: foo {"foo":"bar","baz":"qux","bool":false,"null":null} []'."\n", $message);
-    }
-
-    public function testDefFormatExtras()
-    {
-        $formatter = new LineFormatter(null, 'Y-m-d');
-        $message = $formatter->format(array(
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array(),
-            'datetime' => new \DateTime,
-            'extra' => array('ip' => '127.0.0.1'),
-            'message' => 'log',
-        ));
-        $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log [] {"ip":"127.0.0.1"}'."\n", $message);
-    }
-
-    public function testFormatExtras()
-    {
-        $formatter = new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context% %extra.file% %extra%\n", 'Y-m-d');
-        $message = $formatter->format(array(
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array(),
-            'datetime' => new \DateTime,
-            'extra' => array('ip' => '127.0.0.1', 'file' => 'test'),
-            'message' => 'log',
-        ));
-        $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log [] test {"ip":"127.0.0.1"}'."\n", $message);
-    }
-
-    public function testContextAndExtraOptionallyNotShownIfEmpty()
-    {
-        $formatter = new LineFormatter(null, 'Y-m-d', false, true);
-        $message = $formatter->format(array(
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array(),
-            'datetime' => new \DateTime,
-            'extra' => array(),
-            'message' => 'log',
-        ));
-        $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log  '."\n", $message);
-    }
-
-    public function testContextAndExtraReplacement()
-    {
-        $formatter = new LineFormatter('%context.foo% => %extra.foo%');
-        $message = $formatter->format(array(
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('foo' => 'bar'),
-            'datetime' => new \DateTime,
-            'extra' => array('foo' => 'xbar'),
-            'message' => 'log',
-        ));
-        $this->assertEquals('bar => xbar', $message);
-    }
-
-    public function testDefFormatWithObject()
-    {
-        $formatter = new LineFormatter(null, 'Y-m-d');
-        $message = $formatter->format(array(
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array(),
-            'datetime' => new \DateTime,
-            'extra' => array('foo' => new TestFoo, 'bar' => new TestBar, 'baz' => array(), 'res' => fopen('php://memory', 'rb')),
-            'message' => 'foobar',
-        ));
-
-        $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: foobar [] {"foo":"[object] (Monolog\\\\Formatter\\\\TestFoo: {\\"foo\\":\\"foo\\"})","bar":"[object] (Monolog\\\\Formatter\\\\TestBar: bar)","baz":[],"res":"[resource] (stream)"}'."\n", $message);
-    }
-
-    public function testDefFormatWithException()
-    {
-        $formatter = new LineFormatter(null, 'Y-m-d');
-        $message = $formatter->format(array(
-            'level_name' => 'CRITICAL',
-            'channel' => 'core',
-            'context' => array('exception' => new \RuntimeException('Foo')),
-            'datetime' => new \DateTime,
-            'extra' => array(),
-            'message' => 'foobar',
-        ));
-
-        $path = str_replace('\\/', '/', json_encode(__FILE__));
-
-        $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (RuntimeException(code: 0): Foo at '.substr($path, 1, -1).':'.(__LINE__ - 8).')"} []'."\n", $message);
-    }
-
-    public function testDefFormatWithPreviousException()
-    {
-        $formatter = new LineFormatter(null, 'Y-m-d');
-        $previous = new \LogicException('Wut?');
-        $message = $formatter->format(array(
-            'level_name' => 'CRITICAL',
-            'channel' => 'core',
-            'context' => array('exception' => new \RuntimeException('Foo', 0, $previous)),
-            'datetime' => new \DateTime,
-            'extra' => array(),
-            'message' => 'foobar',
-        ));
-
-        $path = str_replace('\\/', '/', json_encode(__FILE__));
-
-        $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (RuntimeException(code: 0): Foo at '.substr($path, 1, -1).':'.(__LINE__ - 8).', LogicException(code: 0): Wut? at '.substr($path, 1, -1).':'.(__LINE__ - 12).')"} []'."\n", $message);
-    }
-
-    public function testBatchFormat()
-    {
-        $formatter = new LineFormatter(null, 'Y-m-d');
-        $message = $formatter->formatBatch(array(
-            array(
-                'level_name' => 'CRITICAL',
-                'channel' => 'test',
-                'message' => 'bar',
-                'context' => array(),
-                'datetime' => new \DateTime,
-                'extra' => array(),
-            ),
-            array(
-                'level_name' => 'WARNING',
-                'channel' => 'log',
-                'message' => 'foo',
-                'context' => array(),
-                'datetime' => new \DateTime,
-                'extra' => array(),
-            ),
-        ));
-        $this->assertEquals('['.date('Y-m-d').'] test.CRITICAL: bar [] []'."\n".'['.date('Y-m-d').'] log.WARNING: foo [] []'."\n", $message);
-    }
-
-    public function testFormatShouldStripInlineLineBreaks()
-    {
-        $formatter = new LineFormatter(null, 'Y-m-d');
-        $message = $formatter->format(
-            array(
-                'message' => "foo\nbar",
-                'context' => array(),
-                'extra' => array(),
-            )
-        );
-
-        $this->assertRegExp('/foo bar/', $message);
-    }
-
-    public function testFormatShouldNotStripInlineLineBreaksWhenFlagIsSet()
-    {
-        $formatter = new LineFormatter(null, 'Y-m-d', true);
-        $message = $formatter->format(
-            array(
-                'message' => "foo\nbar",
-                'context' => array(),
-                'extra' => array(),
-            )
-        );
-
-        $this->assertRegExp('/foo\nbar/', $message);
-    }
-}
-
-class TestFoo
-{
-    public $foo = 'foo';
-}
-
-class TestBar
-{
-    public function __toString()
-    {
-        return 'bar';
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/LogglyFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/LogglyFormatterTest.php
deleted file mode 100644
index 6d59b3f..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/LogglyFormatterTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-use Monolog\TestCase;
-
-class LogglyFormatterTest extends TestCase
-{
-    /**
-     * @covers Monolog\Formatter\LogglyFormatter::__construct
-     */
-    public function testConstruct()
-    {
-        $formatter = new LogglyFormatter();
-        $this->assertEquals(LogglyFormatter::BATCH_MODE_NEWLINES, $formatter->getBatchMode());
-        $formatter = new LogglyFormatter(LogglyFormatter::BATCH_MODE_JSON);
-        $this->assertEquals(LogglyFormatter::BATCH_MODE_JSON, $formatter->getBatchMode());
-    }
-
-    /**
-     * @covers Monolog\Formatter\LogglyFormatter::format
-     */
-    public function testFormat()
-    {
-        $formatter = new LogglyFormatter();
-        $record = $this->getRecord();
-        $formatted_decoded = json_decode($formatter->format($record), true);
-        $this->assertArrayHasKey("timestamp", $formatted_decoded);
-        $this->assertEquals(new \DateTime($formatted_decoded["timestamp"]), $record["datetime"]);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php
deleted file mode 100644
index 9f6b1cc..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php
+++ /dev/null
@@ -1,333 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-use Monolog\Logger;
-
-class LogstashFormatterTest extends \PHPUnit_Framework_TestCase
-{
-    public function tearDown()
-    {
-        \PHPUnit_Framework_Error_Warning::$enabled = true;
-
-        return parent::tearDown();
-    }
-
-    /**
-     * @covers Monolog\Formatter\LogstashFormatter::format
-     */
-    public function testDefaultFormatter()
-    {
-        $formatter = new LogstashFormatter('test', 'hostname');
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array(),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array(),
-            'message' => 'log',
-        );
-
-        $message = json_decode($formatter->format($record), true);
-
-        $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']);
-        $this->assertEquals('log', $message['@message']);
-        $this->assertEquals('meh', $message['@fields']['channel']);
-        $this->assertContains('meh', $message['@tags']);
-        $this->assertEquals(Logger::ERROR, $message['@fields']['level']);
-        $this->assertEquals('test', $message['@type']);
-        $this->assertEquals('hostname', $message['@source']);
-
-        $formatter = new LogstashFormatter('mysystem');
-
-        $message = json_decode($formatter->format($record), true);
-
-        $this->assertEquals('mysystem', $message['@type']);
-    }
-
-    /**
-     * @covers Monolog\Formatter\LogstashFormatter::format
-     */
-    public function testFormatWithFileAndLine()
-    {
-        $formatter = new LogstashFormatter('test');
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('file' => 'test', 'line' => 14),
-            'message' => 'log',
-        );
-
-        $message = json_decode($formatter->format($record), true);
-
-        $this->assertEquals('test', $message['@fields']['file']);
-        $this->assertEquals(14, $message['@fields']['line']);
-    }
-
-    /**
-     * @covers Monolog\Formatter\LogstashFormatter::format
-     */
-    public function testFormatWithContext()
-    {
-        $formatter = new LogstashFormatter('test');
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('key' => 'pair'),
-            'message' => 'log',
-        );
-
-        $message = json_decode($formatter->format($record), true);
-
-        $message_array = $message['@fields'];
-
-        $this->assertArrayHasKey('ctxt_from', $message_array);
-        $this->assertEquals('logger', $message_array['ctxt_from']);
-
-        // Test with extraPrefix
-        $formatter = new LogstashFormatter('test', null, null, 'CTX');
-        $message = json_decode($formatter->format($record), true);
-
-        $message_array = $message['@fields'];
-
-        $this->assertArrayHasKey('CTXfrom', $message_array);
-        $this->assertEquals('logger', $message_array['CTXfrom']);
-    }
-
-    /**
-     * @covers Monolog\Formatter\LogstashFormatter::format
-     */
-    public function testFormatWithExtra()
-    {
-        $formatter = new LogstashFormatter('test');
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('key' => 'pair'),
-            'message' => 'log',
-        );
-
-        $message = json_decode($formatter->format($record), true);
-
-        $message_array = $message['@fields'];
-
-        $this->assertArrayHasKey('key', $message_array);
-        $this->assertEquals('pair', $message_array['key']);
-
-        // Test with extraPrefix
-        $formatter = new LogstashFormatter('test', null, 'EXT');
-        $message = json_decode($formatter->format($record), true);
-
-        $message_array = $message['@fields'];
-
-        $this->assertArrayHasKey('EXTkey', $message_array);
-        $this->assertEquals('pair', $message_array['EXTkey']);
-    }
-
-    public function testFormatWithApplicationName()
-    {
-        $formatter = new LogstashFormatter('app', 'test');
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('key' => 'pair'),
-            'message' => 'log',
-        );
-
-        $message = json_decode($formatter->format($record), true);
-
-        $this->assertArrayHasKey('@type', $message);
-        $this->assertEquals('app', $message['@type']);
-    }
-
-    /**
-     * @covers Monolog\Formatter\LogstashFormatter::format
-     */
-    public function testDefaultFormatterV1()
-    {
-        $formatter = new LogstashFormatter('test', 'hostname', null, 'ctxt_', LogstashFormatter::V1);
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array(),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array(),
-            'message' => 'log',
-        );
-
-        $message = json_decode($formatter->format($record), true);
-
-        $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']);
-        $this->assertEquals("1", $message['@version']);
-        $this->assertEquals('log', $message['message']);
-        $this->assertEquals('meh', $message['channel']);
-        $this->assertEquals('ERROR', $message['level']);
-        $this->assertEquals('test', $message['type']);
-        $this->assertEquals('hostname', $message['host']);
-
-        $formatter = new LogstashFormatter('mysystem', null, null, 'ctxt_', LogstashFormatter::V1);
-
-        $message = json_decode($formatter->format($record), true);
-
-        $this->assertEquals('mysystem', $message['type']);
-    }
-
-    /**
-     * @covers Monolog\Formatter\LogstashFormatter::format
-     */
-    public function testFormatWithFileAndLineV1()
-    {
-        $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1);
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('file' => 'test', 'line' => 14),
-            'message' => 'log',
-        );
-
-        $message = json_decode($formatter->format($record), true);
-
-        $this->assertEquals('test', $message['file']);
-        $this->assertEquals(14, $message['line']);
-    }
-
-    /**
-     * @covers Monolog\Formatter\LogstashFormatter::format
-     */
-    public function testFormatWithContextV1()
-    {
-        $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1);
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('key' => 'pair'),
-            'message' => 'log',
-        );
-
-        $message = json_decode($formatter->format($record), true);
-
-        $this->assertArrayHasKey('ctxt_from', $message);
-        $this->assertEquals('logger', $message['ctxt_from']);
-
-        // Test with extraPrefix
-        $formatter = new LogstashFormatter('test', null, null, 'CTX', LogstashFormatter::V1);
-        $message = json_decode($formatter->format($record), true);
-
-        $this->assertArrayHasKey('CTXfrom', $message);
-        $this->assertEquals('logger', $message['CTXfrom']);
-    }
-
-    /**
-     * @covers Monolog\Formatter\LogstashFormatter::format
-     */
-    public function testFormatWithExtraV1()
-    {
-        $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1);
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('key' => 'pair'),
-            'message' => 'log',
-        );
-
-        $message = json_decode($formatter->format($record), true);
-
-        $this->assertArrayHasKey('key', $message);
-        $this->assertEquals('pair', $message['key']);
-
-        // Test with extraPrefix
-        $formatter = new LogstashFormatter('test', null, 'EXT', 'ctxt_', LogstashFormatter::V1);
-        $message = json_decode($formatter->format($record), true);
-
-        $this->assertArrayHasKey('EXTkey', $message);
-        $this->assertEquals('pair', $message['EXTkey']);
-    }
-
-    public function testFormatWithApplicationNameV1()
-    {
-        $formatter = new LogstashFormatter('app', 'test', null, 'ctxt_', LogstashFormatter::V1);
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('key' => 'pair'),
-            'message' => 'log',
-        );
-
-        $message = json_decode($formatter->format($record), true);
-
-        $this->assertArrayHasKey('type', $message);
-        $this->assertEquals('app', $message['type']);
-    }
-
-    public function testFormatWithLatin9Data()
-    {
-        if (version_compare(PHP_VERSION, '5.5.0', '<')) {
-            // Ignore the warning that will be emitted by PHP <5.5.0
-            \PHPUnit_Framework_Error_Warning::$enabled = false;
-        }
-        $formatter = new LogstashFormatter('test', 'hostname');
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => '¯\_(ツ)_/¯',
-            'context' => array(),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array(
-                'user_agent' => "\xD6WN; FBCR/OrangeEspa\xF1a; Vers\xE3o/4.0; F\xE4rist",
-            ),
-            'message' => 'log',
-        );
-
-        $message = json_decode($formatter->format($record), true);
-
-        $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']);
-        $this->assertEquals('log', $message['@message']);
-        $this->assertEquals('¯\_(ツ)_/¯', $message['@fields']['channel']);
-        $this->assertContains('¯\_(ツ)_/¯', $message['@tags']);
-        $this->assertEquals(Logger::ERROR, $message['@fields']['level']);
-        $this->assertEquals('test', $message['@type']);
-        $this->assertEquals('hostname', $message['@source']);
-        if (version_compare(PHP_VERSION, '5.5.0', '>=')) {
-            $this->assertEquals('ÖWN; FBCR/OrangeEspaña; Versão/4.0; Färist', $message['@fields']['user_agent']);
-        } else {
-            // PHP <5.5 does not return false for an element encoding failure,
-            // instead it emits a warning (possibly) and nulls the value.
-            $this->assertEquals(null, $message['@fields']['user_agent']);
-        }
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/MongoDBFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/MongoDBFormatterTest.php
deleted file mode 100644
index 52e699e..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/MongoDBFormatterTest.php
+++ /dev/null
@@ -1,262 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-use Monolog\Logger;
-
-/**
- * @author Florian Plattner <me@florianplattner.de>
- */
-class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase
-{
-    public function setUp()
-    {
-        if (!class_exists('MongoDate')) {
-            $this->markTestSkipped('mongo extension not installed');
-        }
-    }
-
-    public function constructArgumentProvider()
-    {
-        return array(
-            array(1, true, 1, true),
-            array(0, false, 0, false),
-        );
-    }
-
-    /**
-     * @param $traceDepth
-     * @param $traceAsString
-     * @param $expectedTraceDepth
-     * @param $expectedTraceAsString
-     *
-     * @dataProvider constructArgumentProvider
-     */
-    public function testConstruct($traceDepth, $traceAsString, $expectedTraceDepth, $expectedTraceAsString)
-    {
-        $formatter = new MongoDBFormatter($traceDepth, $traceAsString);
-
-        $reflTrace = new \ReflectionProperty($formatter, 'exceptionTraceAsString');
-        $reflTrace->setAccessible(true);
-        $this->assertEquals($expectedTraceAsString, $reflTrace->getValue($formatter));
-
-        $reflDepth = new\ReflectionProperty($formatter, 'maxNestingLevel');
-        $reflDepth->setAccessible(true);
-        $this->assertEquals($expectedTraceDepth, $reflDepth->getValue($formatter));
-    }
-
-    public function testSimpleFormat()
-    {
-        $record = array(
-            'message' => 'some log message',
-            'context' => array(),
-            'level' => Logger::WARNING,
-            'level_name' => Logger::getLevelName(Logger::WARNING),
-            'channel' => 'test',
-            'datetime' => new \DateTime('2014-02-01 00:00:00'),
-            'extra' => array(),
-        );
-
-        $formatter = new MongoDBFormatter();
-        $formattedRecord = $formatter->format($record);
-
-        $this->assertCount(7, $formattedRecord);
-        $this->assertEquals('some log message', $formattedRecord['message']);
-        $this->assertEquals(array(), $formattedRecord['context']);
-        $this->assertEquals(Logger::WARNING, $formattedRecord['level']);
-        $this->assertEquals(Logger::getLevelName(Logger::WARNING), $formattedRecord['level_name']);
-        $this->assertEquals('test', $formattedRecord['channel']);
-        $this->assertInstanceOf('\MongoDate', $formattedRecord['datetime']);
-        $this->assertEquals('0.00000000 1391212800', $formattedRecord['datetime']->__toString());
-        $this->assertEquals(array(), $formattedRecord['extra']);
-    }
-
-    public function testRecursiveFormat()
-    {
-        $someObject = new \stdClass();
-        $someObject->foo = 'something';
-        $someObject->bar = 'stuff';
-
-        $record = array(
-            'message' => 'some log message',
-            'context' => array(
-                'stuff' => new \DateTime('2014-02-01 02:31:33'),
-                'some_object' => $someObject,
-                'context_string' => 'some string',
-                'context_int' => 123456,
-                'except' => new \Exception('exception message', 987),
-            ),
-            'level' => Logger::WARNING,
-            'level_name' => Logger::getLevelName(Logger::WARNING),
-            'channel' => 'test',
-            'datetime' => new \DateTime('2014-02-01 00:00:00'),
-            'extra' => array(),
-        );
-
-        $formatter = new MongoDBFormatter();
-        $formattedRecord = $formatter->format($record);
-
-        $this->assertCount(5, $formattedRecord['context']);
-        $this->assertInstanceOf('\MongoDate', $formattedRecord['context']['stuff']);
-        $this->assertEquals('0.00000000 1391221893', $formattedRecord['context']['stuff']->__toString());
-        $this->assertEquals(
-            array(
-                'foo' => 'something',
-                'bar' => 'stuff',
-                'class' => 'stdClass',
-            ),
-            $formattedRecord['context']['some_object']
-        );
-        $this->assertEquals('some string', $formattedRecord['context']['context_string']);
-        $this->assertEquals(123456, $formattedRecord['context']['context_int']);
-
-        $this->assertCount(5, $formattedRecord['context']['except']);
-        $this->assertEquals('exception message', $formattedRecord['context']['except']['message']);
-        $this->assertEquals(987, $formattedRecord['context']['except']['code']);
-        $this->assertInternalType('string', $formattedRecord['context']['except']['file']);
-        $this->assertInternalType('integer', $formattedRecord['context']['except']['code']);
-        $this->assertInternalType('string', $formattedRecord['context']['except']['trace']);
-        $this->assertEquals('Exception', $formattedRecord['context']['except']['class']);
-    }
-
-    public function testFormatDepthArray()
-    {
-        $record = array(
-            'message' => 'some log message',
-            'context' => array(
-                'nest2' => array(
-                    'property' => 'anything',
-                    'nest3' => array(
-                        'nest4' => 'value',
-                        'property' => 'nothing',
-                    ),
-                ),
-            ),
-            'level' => Logger::WARNING,
-            'level_name' => Logger::getLevelName(Logger::WARNING),
-            'channel' => 'test',
-            'datetime' => new \DateTime('2014-02-01 00:00:00'),
-            'extra' => array(),
-        );
-
-        $formatter = new MongoDBFormatter(2);
-        $formattedResult = $formatter->format($record);
-
-        $this->assertEquals(
-            array(
-                'nest2' => array(
-                    'property' => 'anything',
-                    'nest3' => '[...]',
-                ),
-            ),
-            $formattedResult['context']
-        );
-    }
-
-    public function testFormatDepthArrayInfiniteNesting()
-    {
-        $record = array(
-            'message' => 'some log message',
-            'context' => array(
-                'nest2' => array(
-                    'property' => 'something',
-                    'nest3' => array(
-                        'property' => 'anything',
-                        'nest4' => array(
-                            'property' => 'nothing',
-                        ),
-                    ),
-                ),
-            ),
-            'level' => Logger::WARNING,
-            'level_name' => Logger::getLevelName(Logger::WARNING),
-            'channel' => 'test',
-            'datetime' => new \DateTime('2014-02-01 00:00:00'),
-            'extra' => array(),
-        );
-
-        $formatter = new MongoDBFormatter(0);
-        $formattedResult = $formatter->format($record);
-
-        $this->assertEquals(
-            array(
-                'nest2' => array(
-                    'property' => 'something',
-                    'nest3' => array(
-                        'property' => 'anything',
-                        'nest4' => array(
-                            'property' => 'nothing',
-                        ),
-                    ),
-                ),
-            ),
-            $formattedResult['context']
-        );
-    }
-
-    public function testFormatDepthObjects()
-    {
-        $someObject = new \stdClass();
-        $someObject->property = 'anything';
-        $someObject->nest3 = new \stdClass();
-        $someObject->nest3->property = 'nothing';
-        $someObject->nest3->nest4 = 'invisible';
-
-        $record = array(
-            'message' => 'some log message',
-            'context' => array(
-                'nest2' => $someObject,
-            ),
-            'level' => Logger::WARNING,
-            'level_name' => Logger::getLevelName(Logger::WARNING),
-            'channel' => 'test',
-            'datetime' => new \DateTime('2014-02-01 00:00:00'),
-            'extra' => array(),
-        );
-
-        $formatter = new MongoDBFormatter(2, true);
-        $formattedResult = $formatter->format($record);
-
-        $this->assertEquals(
-            array(
-                'nest2' => array(
-                    'property' => 'anything',
-                    'nest3' => '[...]',
-                    'class' => 'stdClass',
-                ),
-            ),
-            $formattedResult['context']
-        );
-    }
-
-    public function testFormatDepthException()
-    {
-        $record = array(
-            'message' => 'some log message',
-            'context' => array(
-                'nest2' => new \Exception('exception message', 987),
-            ),
-            'level' => Logger::WARNING,
-            'level_name' => Logger::getLevelName(Logger::WARNING),
-            'channel' => 'test',
-            'datetime' => new \DateTime('2014-02-01 00:00:00'),
-            'extra' => array(),
-        );
-
-        $formatter = new MongoDBFormatter(2, false);
-        $formattedRecord = $formatter->format($record);
-
-        $this->assertEquals('exception message', $formattedRecord['context']['nest2']['message']);
-        $this->assertEquals(987, $formattedRecord['context']['nest2']['code']);
-        $this->assertEquals('[...]', $formattedRecord['context']['nest2']['trace']);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php
deleted file mode 100644
index bafd1c7..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php
+++ /dev/null
@@ -1,481 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-/**
- * @covers Monolog\Formatter\NormalizerFormatter
- */
-class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
-{
-    public function tearDown()
-    {
-        \PHPUnit_Framework_Error_Warning::$enabled = true;
-
-        return parent::tearDown();
-    }
-
-    public function testFormat()
-    {
-        $formatter = new NormalizerFormatter('Y-m-d');
-        $formatted = $formatter->format(array(
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'message' => 'foo',
-            'datetime' => new \DateTime,
-            'extra' => array('foo' => new TestFooNorm, 'bar' => new TestBarNorm, 'baz' => array(), 'res' => fopen('php://memory', 'rb')),
-            'context' => array(
-                'foo' => 'bar',
-                'baz' => 'qux',
-                'inf' => INF,
-                '-inf' => -INF,
-                'nan' => acos(4),
-            ),
-        ));
-
-        $this->assertEquals(array(
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'message' => 'foo',
-            'datetime' => date('Y-m-d'),
-            'extra' => array(
-                'foo' => '[object] (Monolog\\Formatter\\TestFooNorm: {"foo":"foo"})',
-                'bar' => '[object] (Monolog\\Formatter\\TestBarNorm: bar)',
-                'baz' => array(),
-                'res' => '[resource] (stream)',
-            ),
-            'context' => array(
-                'foo' => 'bar',
-                'baz' => 'qux',
-                'inf' => 'INF',
-                '-inf' => '-INF',
-                'nan' => 'NaN',
-            ),
-        ), $formatted);
-    }
-
-    public function testFormatExceptions()
-    {
-        $formatter = new NormalizerFormatter('Y-m-d');
-        $e = new \LogicException('bar');
-        $e2 = new \RuntimeException('foo', 0, $e);
-        $formatted = $formatter->format(array(
-            'exception' => $e2,
-        ));
-
-        $this->assertGreaterThan(5, count($formatted['exception']['trace']));
-        $this->assertTrue(isset($formatted['exception']['previous']));
-        unset($formatted['exception']['trace'], $formatted['exception']['previous']);
-
-        $this->assertEquals(array(
-            'exception' => array(
-                'class'   => get_class($e2),
-                'message' => $e2->getMessage(),
-                'code'    => $e2->getCode(),
-                'file'    => $e2->getFile().':'.$e2->getLine(),
-            ),
-        ), $formatted);
-    }
-
-    public function testFormatSoapFaultException()
-    {
-        if (!class_exists('SoapFault')) {
-            $this->markTestSkipped('Requires the soap extension');
-        }
-
-        $formatter = new NormalizerFormatter('Y-m-d');
-        $e = new \SoapFault('foo', 'bar', 'hello', 'world');
-        $formatted = $formatter->format(array(
-            'exception' => $e,
-        ));
-
-        unset($formatted['exception']['trace']);
-
-        $this->assertEquals(array(
-            'exception' => array(
-                'class' => 'SoapFault',
-                'message' => 'bar',
-                'code' => 0,
-                'file' => $e->getFile().':'.$e->getLine(),
-                'faultcode' => 'foo',
-                'faultactor' => 'hello',
-                'detail' => 'world',
-            ),
-        ), $formatted);
-    }
-
-    public function testFormatToStringExceptionHandle()
-    {
-        $formatter = new NormalizerFormatter('Y-m-d');
-        $this->setExpectedException('RuntimeException', 'Could not convert to string');
-        $formatter->format(array(
-            'myObject' => new TestToStringError(),
-        ));
-    }
-
-    public function testBatchFormat()
-    {
-        $formatter = new NormalizerFormatter('Y-m-d');
-        $formatted = $formatter->formatBatch(array(
-            array(
-                'level_name' => 'CRITICAL',
-                'channel' => 'test',
-                'message' => 'bar',
-                'context' => array(),
-                'datetime' => new \DateTime,
-                'extra' => array(),
-            ),
-            array(
-                'level_name' => 'WARNING',
-                'channel' => 'log',
-                'message' => 'foo',
-                'context' => array(),
-                'datetime' => new \DateTime,
-                'extra' => array(),
-            ),
-        ));
-        $this->assertEquals(array(
-            array(
-                'level_name' => 'CRITICAL',
-                'channel' => 'test',
-                'message' => 'bar',
-                'context' => array(),
-                'datetime' => date('Y-m-d'),
-                'extra' => array(),
-            ),
-            array(
-                'level_name' => 'WARNING',
-                'channel' => 'log',
-                'message' => 'foo',
-                'context' => array(),
-                'datetime' => date('Y-m-d'),
-                'extra' => array(),
-            ),
-        ), $formatted);
-    }
-
-    /**
-     * Test issue #137
-     */
-    public function testIgnoresRecursiveObjectReferences()
-    {
-        // set up the recursion
-        $foo = new \stdClass();
-        $bar = new \stdClass();
-
-        $foo->bar = $bar;
-        $bar->foo = $foo;
-
-        // set an error handler to assert that the error is not raised anymore
-        $that = $this;
-        set_error_handler(function ($level, $message, $file, $line, $context) use ($that) {
-            if (error_reporting() & $level) {
-                restore_error_handler();
-                $that->fail("$message should not be raised");
-            }
-        });
-
-        $formatter = new NormalizerFormatter();
-        $reflMethod = new \ReflectionMethod($formatter, 'toJson');
-        $reflMethod->setAccessible(true);
-        $res = $reflMethod->invoke($formatter, array($foo, $bar), true);
-
-        restore_error_handler();
-
-        $this->assertEquals(@json_encode(array($foo, $bar)), $res);
-    }
-
-    public function testCanNormalizeReferences()
-    {
-        $formatter = new NormalizerFormatter();
-        $x = array('foo' => 'bar');
-        $y = array('x' => &$x);
-        $x['y'] = &$y;
-        $formatter->format($y);
-    }
-
-    public function testIgnoresInvalidTypes()
-    {
-        // set up the recursion
-        $resource = fopen(__FILE__, 'r');
-
-        // set an error handler to assert that the error is not raised anymore
-        $that = $this;
-        set_error_handler(function ($level, $message, $file, $line, $context) use ($that) {
-            if (error_reporting() & $level) {
-                restore_error_handler();
-                $that->fail("$message should not be raised");
-            }
-        });
-
-        $formatter = new NormalizerFormatter();
-        $reflMethod = new \ReflectionMethod($formatter, 'toJson');
-        $reflMethod->setAccessible(true);
-        $res = $reflMethod->invoke($formatter, array($resource), true);
-
-        restore_error_handler();
-
-        $this->assertEquals(@json_encode(array($resource)), $res);
-    }
-
-    public function testNormalizeHandleLargeArraysWithExactly1000Items()
-    {
-        $formatter = new NormalizerFormatter();
-        $largeArray = range(1, 1000);
-
-        $res = $formatter->format(array(
-            'level_name' => 'CRITICAL',
-            'channel' => 'test',
-            'message' => 'bar',
-            'context' => array($largeArray),
-            'datetime' => new \DateTime,
-            'extra' => array(),
-        ));
-
-        $this->assertCount(1000, $res['context'][0]);
-        $this->assertArrayNotHasKey('...', $res['context'][0]);
-    }
-
-    public function testNormalizeHandleLargeArrays()
-    {
-        $formatter = new NormalizerFormatter();
-        $largeArray = range(1, 2000);
-
-        $res = $formatter->format(array(
-            'level_name' => 'CRITICAL',
-            'channel' => 'test',
-            'message' => 'bar',
-            'context' => array($largeArray),
-            'datetime' => new \DateTime,
-            'extra' => array(),
-        ));
-
-        $this->assertCount(1001, $res['context'][0]);
-        $this->assertEquals('Over 1000 items (2000 total), aborting normalization', $res['context'][0]['...']);
-    }
-
-    /**
-     * @expectedException RuntimeException
-     */
-    public function testThrowsOnInvalidEncoding()
-    {
-        if (version_compare(PHP_VERSION, '5.5.0', '<')) {
-            // Ignore the warning that will be emitted by PHP <5.5.0
-            \PHPUnit_Framework_Error_Warning::$enabled = false;
-        }
-        $formatter = new NormalizerFormatter();
-        $reflMethod = new \ReflectionMethod($formatter, 'toJson');
-        $reflMethod->setAccessible(true);
-
-        // send an invalid unicode sequence as a object that can't be cleaned
-        $record = new \stdClass;
-        $record->message = "\xB1\x31";
-        $res = $reflMethod->invoke($formatter, $record);
-        if (PHP_VERSION_ID < 50500 && $res === '{"message":null}') {
-            throw new \RuntimeException('PHP 5.3/5.4 throw a warning and null the value instead of returning false entirely');
-        }
-    }
-
-    public function testConvertsInvalidEncodingAsLatin9()
-    {
-        if (version_compare(PHP_VERSION, '5.5.0', '<')) {
-            // Ignore the warning that will be emitted by PHP <5.5.0
-            \PHPUnit_Framework_Error_Warning::$enabled = false;
-        }
-        $formatter = new NormalizerFormatter();
-        $reflMethod = new \ReflectionMethod($formatter, 'toJson');
-        $reflMethod->setAccessible(true);
-
-        $res = $reflMethod->invoke($formatter, array('message' => "\xA4\xA6\xA8\xB4\xB8\xBC\xBD\xBE"));
-
-        if (version_compare(PHP_VERSION, '5.5.0', '>=')) {
-            $this->assertSame('{"message":"€ŠšŽžŒœŸ"}', $res);
-        } else {
-            // PHP <5.5 does not return false for an element encoding failure,
-            // instead it emits a warning (possibly) and nulls the value.
-            $this->assertSame('{"message":null}', $res);
-        }
-    }
-
-    /**
-     * @param mixed $in     Input
-     * @param mixed $expect Expected output
-     * @covers Monolog\Formatter\NormalizerFormatter::detectAndCleanUtf8
-     * @dataProvider providesDetectAndCleanUtf8
-     */
-    public function testDetectAndCleanUtf8($in, $expect)
-    {
-        $formatter = new NormalizerFormatter();
-        $formatter->detectAndCleanUtf8($in);
-        $this->assertSame($expect, $in);
-    }
-
-    public function providesDetectAndCleanUtf8()
-    {
-        $obj = new \stdClass;
-
-        return array(
-            'null' => array(null, null),
-            'int' => array(123, 123),
-            'float' => array(123.45, 123.45),
-            'bool false' => array(false, false),
-            'bool true' => array(true, true),
-            'ascii string' => array('abcdef', 'abcdef'),
-            'latin9 string' => array("\xB1\x31\xA4\xA6\xA8\xB4\xB8\xBC\xBD\xBE\xFF", '±1€ŠšŽžŒœŸÿ'),
-            'unicode string' => array('¤¦¨´¸¼½¾€ŠšŽžŒœŸ', '¤¦¨´¸¼½¾€ŠšŽžŒœŸ'),
-            'empty array' => array(array(), array()),
-            'array' => array(array('abcdef'), array('abcdef')),
-            'object' => array($obj, $obj),
-        );
-    }
-
-    /**
-     * @param int    $code
-     * @param string $msg
-     * @dataProvider providesHandleJsonErrorFailure
-     */
-    public function testHandleJsonErrorFailure($code, $msg)
-    {
-        $formatter = new NormalizerFormatter();
-        $reflMethod = new \ReflectionMethod($formatter, 'handleJsonError');
-        $reflMethod->setAccessible(true);
-
-        $this->setExpectedException('RuntimeException', $msg);
-        $reflMethod->invoke($formatter, $code, 'faked');
-    }
-
-    public function providesHandleJsonErrorFailure()
-    {
-        return array(
-            'depth' => array(JSON_ERROR_DEPTH, 'Maximum stack depth exceeded'),
-            'state' => array(JSON_ERROR_STATE_MISMATCH, 'Underflow or the modes mismatch'),
-            'ctrl' => array(JSON_ERROR_CTRL_CHAR, 'Unexpected control character found'),
-            'default' => array(-1, 'Unknown error'),
-        );
-    }
-
-    public function testExceptionTraceWithArgs()
-    {
-        if (defined('HHVM_VERSION')) {
-            $this->markTestSkipped('Not supported in HHVM since it detects errors differently');
-        }
-
-        // This happens i.e. in React promises or Guzzle streams where stream wrappers are registered
-        // and no file or line are included in the trace because it's treated as internal function
-        set_error_handler(function ($errno, $errstr, $errfile, $errline) {
-            throw new \ErrorException($errstr, 0, $errno, $errfile, $errline);
-        });
-
-        try {
-            // This will contain $resource and $wrappedResource as arguments in the trace item
-            $resource = fopen('php://memory', 'rw+');
-            fwrite($resource, 'test_resource');
-            $wrappedResource = new TestFooNorm;
-            $wrappedResource->foo = $resource;
-            // Just do something stupid with a resource/wrapped resource as argument
-            array_keys($wrappedResource);
-        } catch (\Exception $e) {
-            restore_error_handler();
-        }
-
-        $formatter = new NormalizerFormatter();
-        $record = array('context' => array('exception' => $e));
-        $result = $formatter->format($record);
-
-        $this->assertRegExp(
-            '%"resource":"\[resource\] \(stream\)"%',
-            $result['context']['exception']['trace'][0]
-        );
-
-        if (version_compare(PHP_VERSION, '5.5.0', '>=')) {
-            $pattern = '%"wrappedResource":"\[object\] \(Monolog\\\\\\\\Formatter\\\\\\\\TestFooNorm: \)"%';
-        } else {
-            $pattern = '%\\\\"foo\\\\":null%';
-        }
-
-        // Tests that the wrapped resource is ignored while encoding, only works for PHP <= 5.4
-        $this->assertRegExp(
-            $pattern,
-            $result['context']['exception']['trace'][0]
-        );
-    }
-
-    public function testExceptionTraceDoesNotLeakCallUserFuncArgs()
-    {
-        try {
-            $arg = new TestInfoLeak;
-            call_user_func(array($this, 'throwHelper'), $arg, $dt = new \DateTime());
-        } catch (\Exception $e) {
-        }
-
-        $formatter = new NormalizerFormatter();
-        $record = array('context' => array('exception' => $e));
-        $result = $formatter->format($record);
-
-        $this->assertSame(
-            '{"function":"throwHelper","class":"Monolog\\\\Formatter\\\\NormalizerFormatterTest","type":"->","args":["[object] (Monolog\\\\Formatter\\\\TestInfoLeak)","'.$dt->format('Y-m-d H:i:s').'"]}',
-            $result['context']['exception']['trace'][0]
-        );
-    }
-
-    private function throwHelper($arg)
-    {
-        throw new \RuntimeException('Thrown');
-    }
-}
-
-class TestFooNorm
-{
-    public $foo = 'foo';
-}
-
-class TestBarNorm
-{
-    public function __toString()
-    {
-        return 'bar';
-    }
-}
-
-class TestStreamFoo
-{
-    public $foo;
-    public $resource;
-
-    public function __construct($resource)
-    {
-        $this->resource = $resource;
-        $this->foo = 'BAR';
-    }
-
-    public function __toString()
-    {
-        fseek($this->resource, 0);
-
-        return $this->foo . ' - ' . (string) stream_get_contents($this->resource);
-    }
-}
-
-class TestToStringError
-{
-    public function __toString()
-    {
-        throw new \RuntimeException('Could not convert to string');
-    }
-}
-
-class TestInfoLeak
-{
-    public function __toString()
-    {
-        return 'Sensitive information';
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php
deleted file mode 100644
index b1c8fd4..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-class ScalarFormatterTest extends \PHPUnit_Framework_TestCase
-{
-    private $formatter;
-
-    public function setUp()
-    {
-        $this->formatter = new ScalarFormatter();
-    }
-
-    public function buildTrace(\Exception $e)
-    {
-        $data = array();
-        $trace = $e->getTrace();
-        foreach ($trace as $frame) {
-            if (isset($frame['file'])) {
-                $data[] = $frame['file'].':'.$frame['line'];
-            } else {
-                $data[] = json_encode($frame);
-            }
-        }
-
-        return $data;
-    }
-
-    public function encodeJson($data)
-    {
-        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
-            return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
-        }
-
-        return json_encode($data);
-    }
-
-    public function testFormat()
-    {
-        $exception = new \Exception('foo');
-        $formatted = $this->formatter->format(array(
-            'foo' => 'string',
-            'bar' => 1,
-            'baz' => false,
-            'bam' => array(1, 2, 3),
-            'bat' => array('foo' => 'bar'),
-            'bap' => \DateTime::createFromFormat(\DateTime::ISO8601, '1970-01-01T00:00:00+0000'),
-            'ban' => $exception,
-        ));
-
-        $this->assertSame(array(
-            'foo' => 'string',
-            'bar' => 1,
-            'baz' => false,
-            'bam' => $this->encodeJson(array(1, 2, 3)),
-            'bat' => $this->encodeJson(array('foo' => 'bar')),
-            'bap' => '1970-01-01 00:00:00',
-            'ban' => $this->encodeJson(array(
-                'class'   => get_class($exception),
-                'message' => $exception->getMessage(),
-                'code'    => $exception->getCode(),
-                'file'    => $exception->getFile() . ':' . $exception->getLine(),
-                'trace'   => $this->buildTrace($exception),
-            )),
-        ), $formatted);
-    }
-
-    public function testFormatWithErrorContext()
-    {
-        $context = array('file' => 'foo', 'line' => 1);
-        $formatted = $this->formatter->format(array(
-            'context' => $context,
-        ));
-
-        $this->assertSame(array(
-            'context' => $this->encodeJson($context),
-        ), $formatted);
-    }
-
-    public function testFormatWithExceptionContext()
-    {
-        $exception = new \Exception('foo');
-        $formatted = $this->formatter->format(array(
-            'context' => array(
-                'exception' => $exception,
-            ),
-        ));
-
-        $this->assertSame(array(
-            'context' => $this->encodeJson(array(
-                'exception' => array(
-                    'class'   => get_class($exception),
-                    'message' => $exception->getMessage(),
-                    'code'    => $exception->getCode(),
-                    'file'    => $exception->getFile() . ':' . $exception->getLine(),
-                    'trace'   => $this->buildTrace($exception),
-                ),
-            )),
-        ), $formatted);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php
deleted file mode 100644
index 52f15a3..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-use Monolog\Logger;
-
-class WildfireFormatterTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @covers Monolog\Formatter\WildfireFormatter::format
-     */
-    public function testDefaultFormat()
-    {
-        $wildfire = new WildfireFormatter();
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('ip' => '127.0.0.1'),
-            'message' => 'log',
-        );
-
-        $message = $wildfire->format($record);
-
-        $this->assertEquals(
-            '125|[{"Type":"ERROR","File":"","Line":"","Label":"meh"},'
-                .'{"message":"log","context":{"from":"logger"},"extra":{"ip":"127.0.0.1"}}]|',
-            $message
-        );
-    }
-
-    /**
-     * @covers Monolog\Formatter\WildfireFormatter::format
-     */
-    public function testFormatWithFileAndLine()
-    {
-        $wildfire = new WildfireFormatter();
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('from' => 'logger'),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array('ip' => '127.0.0.1', 'file' => 'test', 'line' => 14),
-            'message' => 'log',
-        );
-
-        $message = $wildfire->format($record);
-
-        $this->assertEquals(
-            '129|[{"Type":"ERROR","File":"test","Line":14,"Label":"meh"},'
-                .'{"message":"log","context":{"from":"logger"},"extra":{"ip":"127.0.0.1"}}]|',
-            $message
-        );
-    }
-
-    /**
-     * @covers Monolog\Formatter\WildfireFormatter::format
-     */
-    public function testFormatWithoutContext()
-    {
-        $wildfire = new WildfireFormatter();
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array(),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array(),
-            'message' => 'log',
-        );
-
-        $message = $wildfire->format($record);
-
-        $this->assertEquals(
-            '58|[{"Type":"ERROR","File":"","Line":"","Label":"meh"},"log"]|',
-            $message
-        );
-    }
-
-    /**
-     * @covers Monolog\Formatter\WildfireFormatter::formatBatch
-     * @expectedException BadMethodCallException
-     */
-    public function testBatchFormatThrowException()
-    {
-        $wildfire = new WildfireFormatter();
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array(),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array(),
-            'message' => 'log',
-        );
-
-        $wildfire->formatBatch(array($record));
-    }
-
-    /**
-     * @covers Monolog\Formatter\WildfireFormatter::format
-     */
-    public function testTableFormat()
-    {
-        $wildfire = new WildfireFormatter();
-        $record = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'table-channel',
-            'context' => array(
-            WildfireFormatter::TABLE => array(
-                    array('col1', 'col2', 'col3'),
-                    array('val1', 'val2', 'val3'),
-                    array('foo1', 'foo2', 'foo3'),
-                    array('bar1', 'bar2', 'bar3'),
-                ),
-            ),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array(),
-            'message' => 'table-message',
-        );
-
-        $message = $wildfire->format($record);
-
-        $this->assertEquals(
-            '171|[{"Type":"TABLE","File":"","Line":"","Label":"table-channel: table-message"},[["col1","col2","col3"],["val1","val2","val3"],["foo1","foo2","foo3"],["bar1","bar2","bar3"]]]|',
-            $message
-        );
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php
deleted file mode 100644
index 568eb9d..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-use Monolog\Formatter\LineFormatter;
-use Monolog\Processor\WebProcessor;
-
-class AbstractHandlerTest extends TestCase
-{
-    /**
-     * @covers Monolog\Handler\AbstractHandler::__construct
-     * @covers Monolog\Handler\AbstractHandler::getLevel
-     * @covers Monolog\Handler\AbstractHandler::setLevel
-     * @covers Monolog\Handler\AbstractHandler::getBubble
-     * @covers Monolog\Handler\AbstractHandler::setBubble
-     * @covers Monolog\Handler\AbstractHandler::getFormatter
-     * @covers Monolog\Handler\AbstractHandler::setFormatter
-     */
-    public function testConstructAndGetSet()
-    {
-        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', array(Logger::WARNING, false));
-        $this->assertEquals(Logger::WARNING, $handler->getLevel());
-        $this->assertEquals(false, $handler->getBubble());
-
-        $handler->setLevel(Logger::ERROR);
-        $handler->setBubble(true);
-        $handler->setFormatter($formatter = new LineFormatter);
-        $this->assertEquals(Logger::ERROR, $handler->getLevel());
-        $this->assertEquals(true, $handler->getBubble());
-        $this->assertSame($formatter, $handler->getFormatter());
-    }
-
-    /**
-     * @covers Monolog\Handler\AbstractHandler::handleBatch
-     */
-    public function testHandleBatch()
-    {
-        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler');
-        $handler->expects($this->exactly(2))
-            ->method('handle');
-        $handler->handleBatch(array($this->getRecord(), $this->getRecord()));
-    }
-
-    /**
-     * @covers Monolog\Handler\AbstractHandler::isHandling
-     */
-    public function testIsHandling()
-    {
-        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', array(Logger::WARNING, false));
-        $this->assertTrue($handler->isHandling($this->getRecord()));
-        $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));
-    }
-
-    /**
-     * @covers Monolog\Handler\AbstractHandler::__construct
-     */
-    public function testHandlesPsrStyleLevels()
-    {
-        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', array('warning', false));
-        $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));
-        $handler->setLevel('debug');
-        $this->assertTrue($handler->isHandling($this->getRecord(Logger::DEBUG)));
-    }
-
-    /**
-     * @covers Monolog\Handler\AbstractHandler::getFormatter
-     * @covers Monolog\Handler\AbstractHandler::getDefaultFormatter
-     */
-    public function testGetFormatterInitializesDefault()
-    {
-        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler');
-        $this->assertInstanceOf('Monolog\Formatter\LineFormatter', $handler->getFormatter());
-    }
-
-    /**
-     * @covers Monolog\Handler\AbstractHandler::pushProcessor
-     * @covers Monolog\Handler\AbstractHandler::popProcessor
-     * @expectedException LogicException
-     */
-    public function testPushPopProcessor()
-    {
-        $logger = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler');
-        $processor1 = new WebProcessor;
-        $processor2 = new WebProcessor;
-
-        $logger->pushProcessor($processor1);
-        $logger->pushProcessor($processor2);
-
-        $this->assertEquals($processor2, $logger->popProcessor());
-        $this->assertEquals($processor1, $logger->popProcessor());
-        $logger->popProcessor();
-    }
-
-    /**
-     * @covers Monolog\Handler\AbstractHandler::pushProcessor
-     * @expectedException InvalidArgumentException
-     */
-    public function testPushProcessorWithNonCallable()
-    {
-        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler');
-
-        $handler->pushProcessor(new \stdClass());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php
deleted file mode 100644
index 24d4f63..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-use Monolog\Processor\WebProcessor;
-
-class AbstractProcessingHandlerTest extends TestCase
-{
-    /**
-     * @covers Monolog\Handler\AbstractProcessingHandler::handle
-     */
-    public function testHandleLowerLevelMessage()
-    {
-        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::WARNING, true));
-        $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG)));
-    }
-
-    /**
-     * @covers Monolog\Handler\AbstractProcessingHandler::handle
-     */
-    public function testHandleBubbling()
-    {
-        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::DEBUG, true));
-        $this->assertFalse($handler->handle($this->getRecord()));
-    }
-
-    /**
-     * @covers Monolog\Handler\AbstractProcessingHandler::handle
-     */
-    public function testHandleNotBubbling()
-    {
-        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::DEBUG, false));
-        $this->assertTrue($handler->handle($this->getRecord()));
-    }
-
-    /**
-     * @covers Monolog\Handler\AbstractProcessingHandler::handle
-     */
-    public function testHandleIsFalseWhenNotHandled()
-    {
-        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::WARNING, false));
-        $this->assertTrue($handler->handle($this->getRecord()));
-        $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG)));
-    }
-
-    /**
-     * @covers Monolog\Handler\AbstractProcessingHandler::processRecord
-     */
-    public function testProcessRecord()
-    {
-        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler');
-        $handler->pushProcessor(new WebProcessor(array(
-            'REQUEST_URI' => '',
-            'REQUEST_METHOD' => '',
-            'REMOTE_ADDR' => '',
-            'SERVER_NAME' => '',
-            'UNIQUE_ID' => '',
-        )));
-        $handledRecord = null;
-        $handler->expects($this->once())
-            ->method('write')
-            ->will($this->returnCallback(function ($record) use (&$handledRecord) {
-                $handledRecord = $record;
-            }))
-        ;
-        $handler->handle($this->getRecord());
-        $this->assertEquals(6, count($handledRecord['extra']));
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php
deleted file mode 100644
index 8e0e723..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php
+++ /dev/null
@@ -1,136 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-use PhpAmqpLib\Message\AMQPMessage;
-use PhpAmqpLib\Connection\AMQPConnection;
-
-/**
- * @covers Monolog\Handler\RotatingFileHandler
- */
-class AmqpHandlerTest extends TestCase
-{
-    public function testHandleAmqpExt()
-    {
-        if (!class_exists('AMQPConnection') || !class_exists('AMQPExchange')) {
-            $this->markTestSkipped("amqp-php not installed");
-        }
-
-        if (!class_exists('AMQPChannel')) {
-            $this->markTestSkipped("Please update AMQP to version >= 1.0");
-        }
-
-        $messages = array();
-
-        $exchange = $this->getMock('AMQPExchange', array('publish', 'setName'), array(), '', false);
-        $exchange->expects($this->once())
-            ->method('setName')
-            ->with('log')
-        ;
-        $exchange->expects($this->any())
-            ->method('publish')
-            ->will($this->returnCallback(function ($message, $routing_key, $flags = 0, $attributes = array()) use (&$messages) {
-                $messages[] = array($message, $routing_key, $flags, $attributes);
-            }))
-        ;
-
-        $handler = new AmqpHandler($exchange, 'log');
-
-        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34));
-
-        $expected = array(
-            array(
-                'message' => 'test',
-                'context' => array(
-                    'data' => array(),
-                    'foo' => 34,
-                ),
-                'level' => 300,
-                'level_name' => 'WARNING',
-                'channel' => 'test',
-                'extra' => array(),
-            ),
-            'warn.test',
-            0,
-            array(
-                'delivery_mode' => 2,
-                'content_type' => 'application/json',
-            ),
-        );
-
-        $handler->handle($record);
-
-        $this->assertCount(1, $messages);
-        $messages[0][0] = json_decode($messages[0][0], true);
-        unset($messages[0][0]['datetime']);
-        $this->assertEquals($expected, $messages[0]);
-    }
-
-    public function testHandlePhpAmqpLib()
-    {
-        if (!class_exists('PhpAmqpLib\Connection\AMQPConnection')) {
-            $this->markTestSkipped("php-amqplib not installed");
-        }
-
-        $messages = array();
-
-        $exchange = $this->getMock('PhpAmqpLib\Channel\AMQPChannel', array('basic_publish', '__destruct'), array(), '', false);
-
-        $exchange->expects($this->any())
-            ->method('basic_publish')
-            ->will($this->returnCallback(function (AMQPMessage $msg, $exchange = "", $routing_key = "", $mandatory = false, $immediate = false, $ticket = null) use (&$messages) {
-                $messages[] = array($msg, $exchange, $routing_key, $mandatory, $immediate, $ticket);
-            }))
-        ;
-
-        $handler = new AmqpHandler($exchange, 'log');
-
-        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34));
-
-        $expected = array(
-            array(
-                'message' => 'test',
-                'context' => array(
-                    'data' => array(),
-                    'foo' => 34,
-                ),
-                'level' => 300,
-                'level_name' => 'WARNING',
-                'channel' => 'test',
-                'extra' => array(),
-            ),
-            'log',
-            'warn.test',
-            false,
-            false,
-            null,
-            array(
-                'delivery_mode' => 2,
-                'content_type' => 'application/json',
-            ),
-        );
-
-        $handler->handle($record);
-
-        $this->assertCount(1, $messages);
-
-        /* @var $msg AMQPMessage */
-        $msg = $messages[0][0];
-        $messages[0][0] = json_decode($msg->body, true);
-        $messages[0][] = $msg->get_properties();
-        unset($messages[0][0]['datetime']);
-
-        $this->assertEquals($expected, $messages[0]);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php
deleted file mode 100644
index ffe45da..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-/**
- * @covers Monolog\Handler\BrowserConsoleHandlerTest
- */
-class BrowserConsoleHandlerTest extends TestCase
-{
-    protected function setUp()
-    {
-        BrowserConsoleHandler::resetStatic();
-    }
-
-    protected function generateScript()
-    {
-        $reflMethod = new \ReflectionMethod('Monolog\Handler\BrowserConsoleHandler', 'generateScript');
-        $reflMethod->setAccessible(true);
-
-        return $reflMethod->invoke(null);
-    }
-
-    public function testStyling()
-    {
-        $handler = new BrowserConsoleHandler();
-        $handler->setFormatter($this->getIdentityFormatter());
-
-        $handler->handle($this->getRecord(Logger::DEBUG, 'foo[[bar]]{color: red}'));
-
-        $expected = <<<EOF
-(function (c) {if (c && c.groupCollapsed) {
-c.log("%cfoo%cbar%c", "font-weight: normal", "color: red", "font-weight: normal");
-}})(console);
-EOF;
-
-        $this->assertEquals($expected, $this->generateScript());
-    }
-
-    public function testEscaping()
-    {
-        $handler = new BrowserConsoleHandler();
-        $handler->setFormatter($this->getIdentityFormatter());
-
-        $handler->handle($this->getRecord(Logger::DEBUG, "[foo] [[\"bar\n[baz]\"]]{color: red}"));
-
-        $expected = <<<EOF
-(function (c) {if (c && c.groupCollapsed) {
-c.log("%c[foo] %c\"bar\\n[baz]\"%c", "font-weight: normal", "color: red", "font-weight: normal");
-}})(console);
-EOF;
-
-        $this->assertEquals($expected, $this->generateScript());
-    }
-
-    public function testAutolabel()
-    {
-        $handler = new BrowserConsoleHandler();
-        $handler->setFormatter($this->getIdentityFormatter());
-
-        $handler->handle($this->getRecord(Logger::DEBUG, '[[foo]]{macro: autolabel}'));
-        $handler->handle($this->getRecord(Logger::DEBUG, '[[bar]]{macro: autolabel}'));
-        $handler->handle($this->getRecord(Logger::DEBUG, '[[foo]]{macro: autolabel}'));
-
-        $expected = <<<EOF
-(function (c) {if (c && c.groupCollapsed) {
-c.log("%c%cfoo%c", "font-weight: normal", "background-color: blue; color: white; border-radius: 3px; padding: 0 2px 0 2px", "font-weight: normal");
-c.log("%c%cbar%c", "font-weight: normal", "background-color: green; color: white; border-radius: 3px; padding: 0 2px 0 2px", "font-weight: normal");
-c.log("%c%cfoo%c", "font-weight: normal", "background-color: blue; color: white; border-radius: 3px; padding: 0 2px 0 2px", "font-weight: normal");
-}})(console);
-EOF;
-
-        $this->assertEquals($expected, $this->generateScript());
-    }
-
-    public function testContext()
-    {
-        $handler = new BrowserConsoleHandler();
-        $handler->setFormatter($this->getIdentityFormatter());
-
-        $handler->handle($this->getRecord(Logger::DEBUG, 'test', array('foo' => 'bar')));
-
-        $expected = <<<EOF
-(function (c) {if (c && c.groupCollapsed) {
-c.groupCollapsed("%ctest", "font-weight: normal");
-c.log("%c%s", "font-weight: bold", "Context");
-c.log("%s: %o", "foo", "bar");
-c.groupEnd();
-}})(console);
-EOF;
-
-        $this->assertEquals($expected, $this->generateScript());
-    }
-
-    public function testConcurrentHandlers()
-    {
-        $handler1 = new BrowserConsoleHandler();
-        $handler1->setFormatter($this->getIdentityFormatter());
-
-        $handler2 = new BrowserConsoleHandler();
-        $handler2->setFormatter($this->getIdentityFormatter());
-
-        $handler1->handle($this->getRecord(Logger::DEBUG, 'test1'));
-        $handler2->handle($this->getRecord(Logger::DEBUG, 'test2'));
-        $handler1->handle($this->getRecord(Logger::DEBUG, 'test3'));
-        $handler2->handle($this->getRecord(Logger::DEBUG, 'test4'));
-
-        $expected = <<<EOF
-(function (c) {if (c && c.groupCollapsed) {
-c.log("%ctest1", "font-weight: normal");
-c.log("%ctest2", "font-weight: normal");
-c.log("%ctest3", "font-weight: normal");
-c.log("%ctest4", "font-weight: normal");
-}})(console);
-EOF;
-
-        $this->assertEquals($expected, $this->generateScript());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php
deleted file mode 100644
index da8b3c3..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php
+++ /dev/null
@@ -1,158 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-class BufferHandlerTest extends TestCase
-{
-    private $shutdownCheckHandler;
-
-    /**
-     * @covers Monolog\Handler\BufferHandler::__construct
-     * @covers Monolog\Handler\BufferHandler::handle
-     * @covers Monolog\Handler\BufferHandler::close
-     */
-    public function testHandleBuffers()
-    {
-        $test = new TestHandler();
-        $handler = new BufferHandler($test);
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::INFO));
-        $this->assertFalse($test->hasDebugRecords());
-        $this->assertFalse($test->hasInfoRecords());
-        $handler->close();
-        $this->assertTrue($test->hasInfoRecords());
-        $this->assertTrue(count($test->getRecords()) === 2);
-    }
-
-    /**
-     * @covers Monolog\Handler\BufferHandler::close
-     * @covers Monolog\Handler\BufferHandler::flush
-     */
-    public function testPropagatesRecordsAtEndOfRequest()
-    {
-        $test = new TestHandler();
-        $handler = new BufferHandler($test);
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $this->shutdownCheckHandler = $test;
-        register_shutdown_function(array($this, 'checkPropagation'));
-    }
-
-    public function checkPropagation()
-    {
-        if (!$this->shutdownCheckHandler->hasWarningRecords() || !$this->shutdownCheckHandler->hasDebugRecords()) {
-            echo '!!! BufferHandlerTest::testPropagatesRecordsAtEndOfRequest failed to verify that the messages have been propagated' . PHP_EOL;
-            exit(1);
-        }
-    }
-
-    /**
-     * @covers Monolog\Handler\BufferHandler::handle
-     */
-    public function testHandleBufferLimit()
-    {
-        $test = new TestHandler();
-        $handler = new BufferHandler($test, 2);
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::INFO));
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $handler->close();
-        $this->assertTrue($test->hasWarningRecords());
-        $this->assertTrue($test->hasInfoRecords());
-        $this->assertFalse($test->hasDebugRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\BufferHandler::handle
-     */
-    public function testHandleBufferLimitWithFlushOnOverflow()
-    {
-        $test = new TestHandler();
-        $handler = new BufferHandler($test, 3, Logger::DEBUG, true, true);
-
-        // send two records
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $this->assertFalse($test->hasDebugRecords());
-        $this->assertCount(0, $test->getRecords());
-
-        // overflow
-        $handler->handle($this->getRecord(Logger::INFO));
-        $this->assertTrue($test->hasDebugRecords());
-        $this->assertCount(3, $test->getRecords());
-
-        // should buffer again
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $this->assertCount(3, $test->getRecords());
-
-        $handler->close();
-        $this->assertCount(5, $test->getRecords());
-        $this->assertTrue($test->hasWarningRecords());
-        $this->assertTrue($test->hasInfoRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\BufferHandler::handle
-     */
-    public function testHandleLevel()
-    {
-        $test = new TestHandler();
-        $handler = new BufferHandler($test, 0, Logger::INFO);
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::INFO));
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->close();
-        $this->assertTrue($test->hasWarningRecords());
-        $this->assertTrue($test->hasInfoRecords());
-        $this->assertFalse($test->hasDebugRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\BufferHandler::flush
-     */
-    public function testFlush()
-    {
-        $test = new TestHandler();
-        $handler = new BufferHandler($test, 0);
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::INFO));
-        $handler->flush();
-        $this->assertTrue($test->hasInfoRecords());
-        $this->assertTrue($test->hasDebugRecords());
-        $this->assertFalse($test->hasWarningRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\BufferHandler::handle
-     */
-    public function testHandleUsesProcessors()
-    {
-        $test = new TestHandler();
-        $handler = new BufferHandler($test);
-        $handler->pushProcessor(function ($record) {
-            $record['extra']['foo'] = true;
-
-            return $record;
-        });
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $handler->flush();
-        $this->assertTrue($test->hasWarningRecords());
-        $records = $test->getRecords();
-        $this->assertTrue($records[0]['extra']['foo']);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php
deleted file mode 100644
index 421cc49..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php
+++ /dev/null
@@ -1,156 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-/**
- * @covers Monolog\Handler\ChromePHPHandler
- */
-class ChromePHPHandlerTest extends TestCase
-{
-    protected function setUp()
-    {
-        TestChromePHPHandler::resetStatic();
-        $_SERVER['HTTP_USER_AGENT'] = 'Monolog Test; Chrome/1.0';
-    }
-
-    /**
-     * @dataProvider agentsProvider
-     */
-    public function testHeaders($agent)
-    {
-        $_SERVER['HTTP_USER_AGENT'] = $agent;
-
-        $handler = new TestChromePHPHandler();
-        $handler->setFormatter($this->getIdentityFormatter());
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::WARNING));
-
-        $expected = array(
-            'X-ChromeLogger-Data'   => base64_encode(utf8_encode(json_encode(array(
-                'version' => ChromePHPHandler::VERSION,
-                'columns' => array('label', 'log', 'backtrace', 'type'),
-                'rows' => array(
-                    'test',
-                    'test',
-                ),
-                'request_uri' => '',
-            )))),
-        );
-
-        $this->assertEquals($expected, $handler->getHeaders());
-    }
-
-    public static function agentsProvider()
-    {
-        return array(
-            array('Monolog Test; Chrome/1.0'),
-            array('Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'),
-            array('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/56.0.2924.76 Chrome/56.0.2924.76 Safari/537.36'),
-            array('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome Safari/537.36'),
-        );
-    }
-
-    public function testHeadersOverflow()
-    {
-        $handler = new TestChromePHPHandler();
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::WARNING, str_repeat('a', 150 * 1024)));
-
-        // overflow chrome headers limit
-        $handler->handle($this->getRecord(Logger::WARNING, str_repeat('a', 100 * 1024)));
-
-        $expected = array(
-            'X-ChromeLogger-Data'   => base64_encode(utf8_encode(json_encode(array(
-                'version' => ChromePHPHandler::VERSION,
-                'columns' => array('label', 'log', 'backtrace', 'type'),
-                'rows' => array(
-                    array(
-                        'test',
-                        'test',
-                        'unknown',
-                        'log',
-                    ),
-                    array(
-                        'test',
-                        str_repeat('a', 150 * 1024),
-                        'unknown',
-                        'warn',
-                    ),
-                    array(
-                        'monolog',
-                        'Incomplete logs, chrome header size limit reached',
-                        'unknown',
-                        'warn',
-                    ),
-                ),
-                'request_uri' => '',
-            )))),
-        );
-
-        $this->assertEquals($expected, $handler->getHeaders());
-    }
-
-    public function testConcurrentHandlers()
-    {
-        $handler = new TestChromePHPHandler();
-        $handler->setFormatter($this->getIdentityFormatter());
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::WARNING));
-
-        $handler2 = new TestChromePHPHandler();
-        $handler2->setFormatter($this->getIdentityFormatter());
-        $handler2->handle($this->getRecord(Logger::DEBUG));
-        $handler2->handle($this->getRecord(Logger::WARNING));
-
-        $expected = array(
-            'X-ChromeLogger-Data'   => base64_encode(utf8_encode(json_encode(array(
-                'version' => ChromePHPHandler::VERSION,
-                'columns' => array('label', 'log', 'backtrace', 'type'),
-                'rows' => array(
-                    'test',
-                    'test',
-                    'test',
-                    'test',
-                ),
-                'request_uri' => '',
-            )))),
-        );
-
-        $this->assertEquals($expected, $handler2->getHeaders());
-    }
-}
-
-class TestChromePHPHandler extends ChromePHPHandler
-{
-    protected $headers = array();
-
-    public static function resetStatic()
-    {
-        self::$initialized = false;
-        self::$overflowed = false;
-        self::$sendHeaders = true;
-        self::$json['rows'] = array();
-    }
-
-    protected function sendHeader($header, $content)
-    {
-        $this->headers[$header] = $content;
-    }
-
-    public function getHeaders()
-    {
-        return $this->headers;
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php
deleted file mode 100644
index 9fc4b38..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-class CouchDBHandlerTest extends TestCase
-{
-    public function testHandle()
-    {
-        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34));
-
-        $handler = new CouchDBHandler();
-
-        try {
-            $handler->handle($record);
-        } catch (\RuntimeException $e) {
-            $this->markTestSkipped('Could not connect to couchdb server on http://localhost:5984');
-        }
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/DeduplicationHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/DeduplicationHandlerTest.php
deleted file mode 100644
index e2aff86..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/DeduplicationHandlerTest.php
+++ /dev/null
@@ -1,165 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-class DeduplicationHandlerTest extends TestCase
-{
-    /**
-     * @covers Monolog\Handler\DeduplicationHandler::flush
-     */
-    public function testFlushPassthruIfAllRecordsUnderTrigger()
-    {
-        $test = new TestHandler();
-        @unlink(sys_get_temp_dir().'/monolog_dedup.log');
-        $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);
-
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::INFO));
-
-        $handler->flush();
-
-        $this->assertTrue($test->hasInfoRecords());
-        $this->assertTrue($test->hasDebugRecords());
-        $this->assertFalse($test->hasWarningRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\DeduplicationHandler::flush
-     * @covers Monolog\Handler\DeduplicationHandler::appendRecord
-     */
-    public function testFlushPassthruIfEmptyLog()
-    {
-        $test = new TestHandler();
-        @unlink(sys_get_temp_dir().'/monolog_dedup.log');
-        $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);
-
-        $handler->handle($this->getRecord(Logger::ERROR, 'Foo:bar'));
-        $handler->handle($this->getRecord(Logger::CRITICAL, "Foo\nbar"));
-
-        $handler->flush();
-
-        $this->assertTrue($test->hasErrorRecords());
-        $this->assertTrue($test->hasCriticalRecords());
-        $this->assertFalse($test->hasWarningRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\DeduplicationHandler::flush
-     * @covers Monolog\Handler\DeduplicationHandler::appendRecord
-     * @covers Monolog\Handler\DeduplicationHandler::isDuplicate
-     * @depends testFlushPassthruIfEmptyLog
-     */
-    public function testFlushSkipsIfLogExists()
-    {
-        $test = new TestHandler();
-        $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);
-
-        $handler->handle($this->getRecord(Logger::ERROR, 'Foo:bar'));
-        $handler->handle($this->getRecord(Logger::CRITICAL, "Foo\nbar"));
-
-        $handler->flush();
-
-        $this->assertFalse($test->hasErrorRecords());
-        $this->assertFalse($test->hasCriticalRecords());
-        $this->assertFalse($test->hasWarningRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\DeduplicationHandler::flush
-     * @covers Monolog\Handler\DeduplicationHandler::appendRecord
-     * @covers Monolog\Handler\DeduplicationHandler::isDuplicate
-     * @depends testFlushPassthruIfEmptyLog
-     */
-    public function testFlushPassthruIfLogTooOld()
-    {
-        $test = new TestHandler();
-        $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);
-
-        $record = $this->getRecord(Logger::ERROR);
-        $record['datetime']->modify('+62seconds');
-        $handler->handle($record);
-        $record = $this->getRecord(Logger::CRITICAL);
-        $record['datetime']->modify('+62seconds');
-        $handler->handle($record);
-
-        $handler->flush();
-
-        $this->assertTrue($test->hasErrorRecords());
-        $this->assertTrue($test->hasCriticalRecords());
-        $this->assertFalse($test->hasWarningRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\DeduplicationHandler::flush
-     * @covers Monolog\Handler\DeduplicationHandler::appendRecord
-     * @covers Monolog\Handler\DeduplicationHandler::isDuplicate
-     * @covers Monolog\Handler\DeduplicationHandler::collectLogs
-     */
-    public function testGcOldLogs()
-    {
-        $test = new TestHandler();
-        @unlink(sys_get_temp_dir().'/monolog_dedup.log');
-        $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);
-
-        // handle two records from yesterday, and one recent
-        $record = $this->getRecord(Logger::ERROR);
-        $record['datetime']->modify('-1day -10seconds');
-        $handler->handle($record);
-        $record2 = $this->getRecord(Logger::CRITICAL);
-        $record2['datetime']->modify('-1day -10seconds');
-        $handler->handle($record2);
-        $record3 = $this->getRecord(Logger::CRITICAL);
-        $record3['datetime']->modify('-30seconds');
-        $handler->handle($record3);
-
-        // log is written as none of them are duplicate
-        $handler->flush();
-        $this->assertSame(
-            $record['datetime']->getTimestamp() . ":ERROR:test\n" .
-            $record2['datetime']->getTimestamp() . ":CRITICAL:test\n" .
-            $record3['datetime']->getTimestamp() . ":CRITICAL:test\n",
-            file_get_contents(sys_get_temp_dir() . '/monolog_dedup.log')
-        );
-        $this->assertTrue($test->hasErrorRecords());
-        $this->assertTrue($test->hasCriticalRecords());
-        $this->assertFalse($test->hasWarningRecords());
-
-        // clear test handler
-        $test->clear();
-        $this->assertFalse($test->hasErrorRecords());
-        $this->assertFalse($test->hasCriticalRecords());
-
-        // log new records, duplicate log gets GC'd at the end of this flush call
-        $handler->handle($record = $this->getRecord(Logger::ERROR));
-        $handler->handle($record2 = $this->getRecord(Logger::CRITICAL));
-        $handler->flush();
-
-        // log should now contain the new errors and the previous one that was recent enough
-        $this->assertSame(
-            $record3['datetime']->getTimestamp() . ":CRITICAL:test\n" .
-            $record['datetime']->getTimestamp() . ":ERROR:test\n" .
-            $record2['datetime']->getTimestamp() . ":CRITICAL:test\n",
-            file_get_contents(sys_get_temp_dir() . '/monolog_dedup.log')
-        );
-        $this->assertTrue($test->hasErrorRecords());
-        $this->assertTrue($test->hasCriticalRecords());
-        $this->assertFalse($test->hasWarningRecords());
-    }
-
-    public static function tearDownAfterClass()
-    {
-        @unlink(sys_get_temp_dir().'/monolog_dedup.log');
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php
deleted file mode 100644
index d67da90..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-class DoctrineCouchDBHandlerTest extends TestCase
-{
-    protected function setup()
-    {
-        if (!class_exists('Doctrine\CouchDB\CouchDBClient')) {
-            $this->markTestSkipped('The "doctrine/couchdb" package is not installed');
-        }
-    }
-
-    public function testHandle()
-    {
-        $client = $this->getMockBuilder('Doctrine\\CouchDB\\CouchDBClient')
-            ->setMethods(array('postDocument'))
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34));
-
-        $expected = array(
-            'message' => 'test',
-            'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34),
-            'level' => Logger::WARNING,
-            'level_name' => 'WARNING',
-            'channel' => 'test',
-            'datetime' => $record['datetime']->format('Y-m-d H:i:s'),
-            'extra' => array(),
-        );
-
-        $client->expects($this->once())
-            ->method('postDocument')
-            ->with($expected);
-
-        $handler = new DoctrineCouchDBHandler($client);
-        $handler->handle($record);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php
deleted file mode 100644
index 2e6c348..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-
-class DynamoDbHandlerTest extends TestCase
-{
-    private $client;
-
-    public function setUp()
-    {
-        if (!class_exists('Aws\DynamoDb\DynamoDbClient')) {
-            $this->markTestSkipped('aws/aws-sdk-php not installed');
-        }
-
-        $this->client = $this->getMockBuilder('Aws\DynamoDb\DynamoDbClient')
-            ->setMethods(array('formatAttributes', '__call'))
-            ->disableOriginalConstructor()->getMock();
-    }
-
-    public function testConstruct()
-    {
-        $this->assertInstanceOf('Monolog\Handler\DynamoDbHandler', new DynamoDbHandler($this->client, 'foo'));
-    }
-
-    public function testInterface()
-    {
-        $this->assertInstanceOf('Monolog\Handler\HandlerInterface', new DynamoDbHandler($this->client, 'foo'));
-    }
-
-    public function testGetFormatter()
-    {
-        $handler = new DynamoDbHandler($this->client, 'foo');
-        $this->assertInstanceOf('Monolog\Formatter\ScalarFormatter', $handler->getFormatter());
-    }
-
-    public function testHandle()
-    {
-        $record = $this->getRecord();
-        $formatter = $this->getMock('Monolog\Formatter\FormatterInterface');
-        $formatted = array('foo' => 1, 'bar' => 2);
-        $handler = new DynamoDbHandler($this->client, 'foo');
-        $handler->setFormatter($formatter);
-
-        $isV3 = defined('Aws\Sdk::VERSION') && version_compare(\Aws\Sdk::VERSION, '3.0', '>=');
-        if ($isV3) {
-            $expFormatted = array('foo' => array('N' => 1), 'bar' => array('N' => 2));
-        } else {
-            $expFormatted = $formatted;
-        }
-
-        $formatter
-             ->expects($this->once())
-             ->method('format')
-             ->with($record)
-             ->will($this->returnValue($formatted));
-        $this->client
-             ->expects($isV3 ? $this->never() : $this->once())
-             ->method('formatAttributes')
-             ->with($this->isType('array'))
-             ->will($this->returnValue($formatted));
-        $this->client
-             ->expects($this->once())
-             ->method('__call')
-             ->with('putItem', array(array(
-                 'TableName' => 'foo',
-                 'Item' => $expFormatted,
-             )));
-
-        $handler->handle($record);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php
deleted file mode 100644
index 1687074..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php
+++ /dev/null
@@ -1,239 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\Formatter\ElasticaFormatter;
-use Monolog\Formatter\NormalizerFormatter;
-use Monolog\TestCase;
-use Monolog\Logger;
-use Elastica\Client;
-use Elastica\Request;
-use Elastica\Response;
-
-class ElasticSearchHandlerTest extends TestCase
-{
-    /**
-     * @var Client mock
-     */
-    protected $client;
-
-    /**
-     * @var array Default handler options
-     */
-    protected $options = array(
-        'index' => 'my_index',
-        'type'  => 'doc_type',
-    );
-
-    public function setUp()
-    {
-        // Elastica lib required
-        if (!class_exists("Elastica\Client")) {
-            $this->markTestSkipped("ruflin/elastica not installed");
-        }
-
-        // base mock Elastica Client object
-        $this->client = $this->getMockBuilder('Elastica\Client')
-            ->setMethods(array('addDocuments'))
-            ->disableOriginalConstructor()
-            ->getMock();
-    }
-
-    /**
-     * @covers Monolog\Handler\ElasticSearchHandler::write
-     * @covers Monolog\Handler\ElasticSearchHandler::handleBatch
-     * @covers Monolog\Handler\ElasticSearchHandler::bulkSend
-     * @covers Monolog\Handler\ElasticSearchHandler::getDefaultFormatter
-     */
-    public function testHandle()
-    {
-        // log message
-        $msg = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('foo' => 7, 'bar', 'class' => new \stdClass),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array(),
-            'message' => 'log',
-        );
-
-        // format expected result
-        $formatter = new ElasticaFormatter($this->options['index'], $this->options['type']);
-        $expected = array($formatter->format($msg));
-
-        // setup ES client mock
-        $this->client->expects($this->any())
-            ->method('addDocuments')
-            ->with($expected);
-
-        // perform tests
-        $handler = new ElasticSearchHandler($this->client, $this->options);
-        $handler->handle($msg);
-        $handler->handleBatch(array($msg));
-    }
-
-    /**
-     * @covers Monolog\Handler\ElasticSearchHandler::setFormatter
-     */
-    public function testSetFormatter()
-    {
-        $handler = new ElasticSearchHandler($this->client);
-        $formatter = new ElasticaFormatter('index_new', 'type_new');
-        $handler->setFormatter($formatter);
-        $this->assertInstanceOf('Monolog\Formatter\ElasticaFormatter', $handler->getFormatter());
-        $this->assertEquals('index_new', $handler->getFormatter()->getIndex());
-        $this->assertEquals('type_new', $handler->getFormatter()->getType());
-    }
-
-    /**
-     * @covers                   Monolog\Handler\ElasticSearchHandler::setFormatter
-     * @expectedException        InvalidArgumentException
-     * @expectedExceptionMessage ElasticSearchHandler is only compatible with ElasticaFormatter
-     */
-    public function testSetFormatterInvalid()
-    {
-        $handler = new ElasticSearchHandler($this->client);
-        $formatter = new NormalizerFormatter();
-        $handler->setFormatter($formatter);
-    }
-
-    /**
-     * @covers Monolog\Handler\ElasticSearchHandler::__construct
-     * @covers Monolog\Handler\ElasticSearchHandler::getOptions
-     */
-    public function testOptions()
-    {
-        $expected = array(
-            'index' => $this->options['index'],
-            'type' => $this->options['type'],
-            'ignore_error' => false,
-        );
-        $handler = new ElasticSearchHandler($this->client, $this->options);
-        $this->assertEquals($expected, $handler->getOptions());
-    }
-
-    /**
-     * @covers       Monolog\Handler\ElasticSearchHandler::bulkSend
-     * @dataProvider providerTestConnectionErrors
-     */
-    public function testConnectionErrors($ignore, $expectedError)
-    {
-        $clientOpts = array('host' => '127.0.0.1', 'port' => 1);
-        $client = new Client($clientOpts);
-        $handlerOpts = array('ignore_error' => $ignore);
-        $handler = new ElasticSearchHandler($client, $handlerOpts);
-
-        if ($expectedError) {
-            $this->setExpectedException($expectedError[0], $expectedError[1]);
-            $handler->handle($this->getRecord());
-        } else {
-            $this->assertFalse($handler->handle($this->getRecord()));
-        }
-    }
-
-    /**
-     * @return array
-     */
-    public function providerTestConnectionErrors()
-    {
-        return array(
-            array(false, array('RuntimeException', 'Error sending messages to Elasticsearch')),
-            array(true, false),
-        );
-    }
-
-    /**
-     * Integration test using localhost Elastic Search server
-     *
-     * @covers Monolog\Handler\ElasticSearchHandler::__construct
-     * @covers Monolog\Handler\ElasticSearchHandler::handleBatch
-     * @covers Monolog\Handler\ElasticSearchHandler::bulkSend
-     * @covers Monolog\Handler\ElasticSearchHandler::getDefaultFormatter
-     */
-    public function testHandleIntegration()
-    {
-        $msg = array(
-            'level' => Logger::ERROR,
-            'level_name' => 'ERROR',
-            'channel' => 'meh',
-            'context' => array('foo' => 7, 'bar', 'class' => new \stdClass),
-            'datetime' => new \DateTime("@0"),
-            'extra' => array(),
-            'message' => 'log',
-        );
-
-        $expected = $msg;
-        $expected['datetime'] = $msg['datetime']->format(\DateTime::ISO8601);
-        $expected['context'] = array(
-            'class' => '[object] (stdClass: {})',
-            'foo' => 7,
-            0 => 'bar',
-        );
-
-        $client = new Client();
-        $handler = new ElasticSearchHandler($client, $this->options);
-        try {
-            $handler->handleBatch(array($msg));
-        } catch (\RuntimeException $e) {
-            $this->markTestSkipped("Cannot connect to Elastic Search server on localhost");
-        }
-
-        // check document id from ES server response
-        $documentId = $this->getCreatedDocId($client->getLastResponse());
-        $this->assertNotEmpty($documentId, 'No elastic document id received');
-
-        // retrieve document source from ES and validate
-        $document = $this->getDocSourceFromElastic(
-            $client,
-            $this->options['index'],
-            $this->options['type'],
-            $documentId
-        );
-        $this->assertEquals($expected, $document);
-
-        // remove test index from ES
-        $client->request("/{$this->options['index']}", Request::DELETE);
-    }
-
-    /**
-     * Return last created document id from ES response
-     * @param  Response    $response Elastica Response object
-     * @return string|null
-     */
-    protected function getCreatedDocId(Response $response)
-    {
-        $data = $response->getData();
-        if (!empty($data['items'][0]['create']['_id'])) {
-            return $data['items'][0]['create']['_id'];
-        }
-    }
-
-    /**
-     * Retrieve document by id from Elasticsearch
-     * @param  Client $client     Elastica client
-     * @param  string $index
-     * @param  string $type
-     * @param  string $documentId
-     * @return array
-     */
-    protected function getDocSourceFromElastic(Client $client, $index, $type, $documentId)
-    {
-        $resp = $client->request("/{$index}/{$type}/{$documentId}", Request::GET);
-        $data = $resp->getData();
-        if (!empty($data['_source'])) {
-            return $data['_source'];
-        }
-
-        return array();
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php
deleted file mode 100644
index 99785cb..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-use Monolog\Formatter\LineFormatter;
-
-function error_log()
-{
-    $GLOBALS['error_log'][] = func_get_args();
-}
-
-class ErrorLogHandlerTest extends TestCase
-{
-    protected function setUp()
-    {
-        $GLOBALS['error_log'] = array();
-    }
-
-    /**
-     * @covers Monolog\Handler\ErrorLogHandler::__construct
-     * @expectedException InvalidArgumentException
-     * @expectedExceptionMessage The given message type "42" is not supported
-     */
-    public function testShouldNotAcceptAnInvalidTypeOnContructor()
-    {
-        new ErrorLogHandler(42);
-    }
-
-    /**
-     * @covers Monolog\Handler\ErrorLogHandler::write
-     */
-    public function testShouldLogMessagesUsingErrorLogFuncion()
-    {
-        $type = ErrorLogHandler::OPERATING_SYSTEM;
-        $handler = new ErrorLogHandler($type);
-        $handler->setFormatter(new LineFormatter('%channel%.%level_name%: %message% %context% %extra%', null, true));
-        $handler->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz"));
-
-        $this->assertSame("test.ERROR: Foo\nBar\r\n\r\nBaz [] []", $GLOBALS['error_log'][0][0]);
-        $this->assertSame($GLOBALS['error_log'][0][1], $type);
-
-        $handler = new ErrorLogHandler($type, Logger::DEBUG, true, true);
-        $handler->setFormatter(new LineFormatter(null, null, true));
-        $handler->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz"));
-
-        $this->assertStringMatchesFormat('[%s] test.ERROR: Foo', $GLOBALS['error_log'][1][0]);
-        $this->assertSame($GLOBALS['error_log'][1][1], $type);
-
-        $this->assertStringMatchesFormat('Bar', $GLOBALS['error_log'][2][0]);
-        $this->assertSame($GLOBALS['error_log'][2][1], $type);
-
-        $this->assertStringMatchesFormat('Baz [] []', $GLOBALS['error_log'][3][0]);
-        $this->assertSame($GLOBALS['error_log'][3][1], $type);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/FilterHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/FilterHandlerTest.php
deleted file mode 100644
index 31b7686..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/FilterHandlerTest.php
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\Logger;
-use Monolog\TestCase;
-
-class FilterHandlerTest extends TestCase
-{
-    /**
-     * @covers Monolog\Handler\FilterHandler::isHandling
-     */
-    public function testIsHandling()
-    {
-        $test    = new TestHandler();
-        $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE);
-        $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));
-        $this->assertTrue($handler->isHandling($this->getRecord(Logger::INFO)));
-        $this->assertTrue($handler->isHandling($this->getRecord(Logger::NOTICE)));
-        $this->assertFalse($handler->isHandling($this->getRecord(Logger::WARNING)));
-        $this->assertFalse($handler->isHandling($this->getRecord(Logger::ERROR)));
-        $this->assertFalse($handler->isHandling($this->getRecord(Logger::CRITICAL)));
-        $this->assertFalse($handler->isHandling($this->getRecord(Logger::ALERT)));
-        $this->assertFalse($handler->isHandling($this->getRecord(Logger::EMERGENCY)));
-    }
-
-    /**
-     * @covers Monolog\Handler\FilterHandler::handle
-     * @covers Monolog\Handler\FilterHandler::setAcceptedLevels
-     * @covers Monolog\Handler\FilterHandler::isHandling
-     */
-    public function testHandleProcessOnlyNeededLevels()
-    {
-        $test    = new TestHandler();
-        $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE);
-
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $this->assertFalse($test->hasDebugRecords());
-
-        $handler->handle($this->getRecord(Logger::INFO));
-        $this->assertTrue($test->hasInfoRecords());
-        $handler->handle($this->getRecord(Logger::NOTICE));
-        $this->assertTrue($test->hasNoticeRecords());
-
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $this->assertFalse($test->hasWarningRecords());
-        $handler->handle($this->getRecord(Logger::ERROR));
-        $this->assertFalse($test->hasErrorRecords());
-        $handler->handle($this->getRecord(Logger::CRITICAL));
-        $this->assertFalse($test->hasCriticalRecords());
-        $handler->handle($this->getRecord(Logger::ALERT));
-        $this->assertFalse($test->hasAlertRecords());
-        $handler->handle($this->getRecord(Logger::EMERGENCY));
-        $this->assertFalse($test->hasEmergencyRecords());
-
-        $test    = new TestHandler();
-        $handler = new FilterHandler($test, array(Logger::INFO, Logger::ERROR));
-
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $this->assertFalse($test->hasDebugRecords());
-        $handler->handle($this->getRecord(Logger::INFO));
-        $this->assertTrue($test->hasInfoRecords());
-        $handler->handle($this->getRecord(Logger::NOTICE));
-        $this->assertFalse($test->hasNoticeRecords());
-        $handler->handle($this->getRecord(Logger::ERROR));
-        $this->assertTrue($test->hasErrorRecords());
-        $handler->handle($this->getRecord(Logger::CRITICAL));
-        $this->assertFalse($test->hasCriticalRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\FilterHandler::setAcceptedLevels
-     * @covers Monolog\Handler\FilterHandler::getAcceptedLevels
-     */
-    public function testAcceptedLevelApi()
-    {
-        $test    = new TestHandler();
-        $handler = new FilterHandler($test);
-
-        $levels = array(Logger::INFO, Logger::ERROR);
-        $handler->setAcceptedLevels($levels);
-        $this->assertSame($levels, $handler->getAcceptedLevels());
-
-        $handler->setAcceptedLevels(array('info', 'error'));
-        $this->assertSame($levels, $handler->getAcceptedLevels());
-
-        $levels = array(Logger::CRITICAL, Logger::ALERT, Logger::EMERGENCY);
-        $handler->setAcceptedLevels(Logger::CRITICAL, Logger::EMERGENCY);
-        $this->assertSame($levels, $handler->getAcceptedLevels());
-
-        $handler->setAcceptedLevels('critical', 'emergency');
-        $this->assertSame($levels, $handler->getAcceptedLevels());
-    }
-
-    /**
-     * @covers Monolog\Handler\FilterHandler::handle
-     */
-    public function testHandleUsesProcessors()
-    {
-        $test    = new TestHandler();
-        $handler = new FilterHandler($test, Logger::DEBUG, Logger::EMERGENCY);
-        $handler->pushProcessor(
-            function ($record) {
-                $record['extra']['foo'] = true;
-
-                return $record;
-            }
-        );
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $this->assertTrue($test->hasWarningRecords());
-        $records = $test->getRecords();
-        $this->assertTrue($records[0]['extra']['foo']);
-    }
-
-    /**
-     * @covers Monolog\Handler\FilterHandler::handle
-     */
-    public function testHandleRespectsBubble()
-    {
-        $test = new TestHandler();
-
-        $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE, false);
-        $this->assertTrue($handler->handle($this->getRecord(Logger::INFO)));
-        $this->assertFalse($handler->handle($this->getRecord(Logger::WARNING)));
-
-        $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE, true);
-        $this->assertFalse($handler->handle($this->getRecord(Logger::INFO)));
-        $this->assertFalse($handler->handle($this->getRecord(Logger::WARNING)));
-    }
-
-    /**
-     * @covers Monolog\Handler\FilterHandler::handle
-     */
-    public function testHandleWithCallback()
-    {
-        $test    = new TestHandler();
-        $handler = new FilterHandler(
-            function ($record, $handler) use ($test) {
-                return $test;
-            }, Logger::INFO, Logger::NOTICE, false
-        );
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::INFO));
-        $this->assertFalse($test->hasDebugRecords());
-        $this->assertTrue($test->hasInfoRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\FilterHandler::handle
-     * @expectedException \RuntimeException
-     */
-    public function testHandleWithBadCallbackThrowsException()
-    {
-        $handler = new FilterHandler(
-            function ($record, $handler) {
-                return 'foo';
-            }
-        );
-        $handler->handle($this->getRecord(Logger::WARNING));
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php
deleted file mode 100644
index 0ec3653..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php
+++ /dev/null
@@ -1,279 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy;
-use Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy;
-use Psr\Log\LogLevel;
-
-class FingersCrossedHandlerTest extends TestCase
-{
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::__construct
-     * @covers Monolog\Handler\FingersCrossedHandler::handle
-     * @covers Monolog\Handler\FingersCrossedHandler::activate
-     */
-    public function testHandleBuffers()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test);
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::INFO));
-        $this->assertFalse($test->hasDebugRecords());
-        $this->assertFalse($test->hasInfoRecords());
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $handler->close();
-        $this->assertTrue($test->hasInfoRecords());
-        $this->assertTrue(count($test->getRecords()) === 3);
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::handle
-     * @covers Monolog\Handler\FingersCrossedHandler::activate
-     */
-    public function testHandleStopsBufferingAfterTrigger()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test);
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->close();
-        $this->assertTrue($test->hasWarningRecords());
-        $this->assertTrue($test->hasDebugRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::handle
-     * @covers Monolog\Handler\FingersCrossedHandler::activate
-     * @covers Monolog\Handler\FingersCrossedHandler::reset
-     */
-    public function testHandleResetBufferingAfterReset()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test);
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->reset();
-        $handler->handle($this->getRecord(Logger::INFO));
-        $handler->close();
-        $this->assertTrue($test->hasWarningRecords());
-        $this->assertTrue($test->hasDebugRecords());
-        $this->assertFalse($test->hasInfoRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::handle
-     * @covers Monolog\Handler\FingersCrossedHandler::activate
-     */
-    public function testHandleResetBufferingAfterBeingTriggeredWhenStopBufferingIsDisabled()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test, Logger::WARNING, 0, false, false);
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $handler->handle($this->getRecord(Logger::INFO));
-        $handler->close();
-        $this->assertTrue($test->hasWarningRecords());
-        $this->assertTrue($test->hasDebugRecords());
-        $this->assertFalse($test->hasInfoRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::handle
-     * @covers Monolog\Handler\FingersCrossedHandler::activate
-     */
-    public function testHandleBufferLimit()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test, Logger::WARNING, 2);
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::INFO));
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $this->assertTrue($test->hasWarningRecords());
-        $this->assertTrue($test->hasInfoRecords());
-        $this->assertFalse($test->hasDebugRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::handle
-     * @covers Monolog\Handler\FingersCrossedHandler::activate
-     */
-    public function testHandleWithCallback()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler(function ($record, $handler) use ($test) {
-                    return $test;
-                });
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::INFO));
-        $this->assertFalse($test->hasDebugRecords());
-        $this->assertFalse($test->hasInfoRecords());
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $this->assertTrue($test->hasInfoRecords());
-        $this->assertTrue(count($test->getRecords()) === 3);
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::handle
-     * @covers Monolog\Handler\FingersCrossedHandler::activate
-     * @expectedException RuntimeException
-     */
-    public function testHandleWithBadCallbackThrowsException()
-    {
-        $handler = new FingersCrossedHandler(function ($record, $handler) {
-                    return 'foo';
-                });
-        $handler->handle($this->getRecord(Logger::WARNING));
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::isHandling
-     */
-    public function testIsHandlingAlways()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test, Logger::ERROR);
-        $this->assertTrue($handler->isHandling($this->getRecord(Logger::DEBUG)));
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::__construct
-     * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::__construct
-     * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::isHandlerActivated
-     */
-    public function testErrorLevelActivationStrategy()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING));
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $this->assertFalse($test->hasDebugRecords());
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $this->assertTrue($test->hasDebugRecords());
-        $this->assertTrue($test->hasWarningRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::__construct
-     * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::__construct
-     * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::isHandlerActivated
-     */
-    public function testErrorLevelActivationStrategyWithPsrLevel()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy('warning'));
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $this->assertFalse($test->hasDebugRecords());
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $this->assertTrue($test->hasDebugRecords());
-        $this->assertTrue($test->hasWarningRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::__construct
-     * @covers Monolog\Handler\FingersCrossedHandler::activate
-     */
-    public function testOverrideActivationStrategy()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy('warning'));
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $this->assertFalse($test->hasDebugRecords());
-        $handler->activate();
-        $this->assertTrue($test->hasDebugRecords());
-        $handler->handle($this->getRecord(Logger::INFO));
-        $this->assertTrue($test->hasInfoRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::__construct
-     * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::isHandlerActivated
-     */
-    public function testChannelLevelActivationStrategy()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test, new ChannelLevelActivationStrategy(Logger::ERROR, array('othertest' => Logger::DEBUG)));
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $this->assertFalse($test->hasWarningRecords());
-        $record = $this->getRecord(Logger::DEBUG);
-        $record['channel'] = 'othertest';
-        $handler->handle($record);
-        $this->assertTrue($test->hasDebugRecords());
-        $this->assertTrue($test->hasWarningRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::__construct
-     * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::isHandlerActivated
-     */
-    public function testChannelLevelActivationStrategyWithPsrLevels()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test, new ChannelLevelActivationStrategy('error', array('othertest' => 'debug')));
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $this->assertFalse($test->hasWarningRecords());
-        $record = $this->getRecord(Logger::DEBUG);
-        $record['channel'] = 'othertest';
-        $handler->handle($record);
-        $this->assertTrue($test->hasDebugRecords());
-        $this->assertTrue($test->hasWarningRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::handle
-     * @covers Monolog\Handler\FingersCrossedHandler::activate
-     */
-    public function testHandleUsesProcessors()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test, Logger::INFO);
-        $handler->pushProcessor(function ($record) {
-            $record['extra']['foo'] = true;
-
-            return $record;
-        });
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $this->assertTrue($test->hasWarningRecords());
-        $records = $test->getRecords();
-        $this->assertTrue($records[0]['extra']['foo']);
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::close
-     */
-    public function testPassthruOnClose()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING), 0, true, true, Logger::INFO);
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::INFO));
-        $handler->close();
-        $this->assertFalse($test->hasDebugRecords());
-        $this->assertTrue($test->hasInfoRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\FingersCrossedHandler::close
-     */
-    public function testPsrLevelPassthruOnClose()
-    {
-        $test = new TestHandler();
-        $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING), 0, true, true, LogLevel::INFO);
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::INFO));
-        $handler->close();
-        $this->assertFalse($test->hasDebugRecords());
-        $this->assertTrue($test->hasInfoRecords());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php
deleted file mode 100644
index 7a404e6..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-/**
- * @covers Monolog\Handler\FirePHPHandler
- */
-class FirePHPHandlerTest extends TestCase
-{
-    public function setUp()
-    {
-        TestFirePHPHandler::resetStatic();
-        $_SERVER['HTTP_USER_AGENT'] = 'Monolog Test; FirePHP/1.0';
-    }
-
-    public function testHeaders()
-    {
-        $handler = new TestFirePHPHandler;
-        $handler->setFormatter($this->getIdentityFormatter());
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::WARNING));
-
-        $expected = array(
-            'X-Wf-Protocol-1'    => 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2',
-            'X-Wf-1-Structure-1' => 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1',
-            'X-Wf-1-Plugin-1'    => 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3',
-            'X-Wf-1-1-1-1'       => 'test',
-            'X-Wf-1-1-1-2'       => 'test',
-        );
-
-        $this->assertEquals($expected, $handler->getHeaders());
-    }
-
-    public function testConcurrentHandlers()
-    {
-        $handler = new TestFirePHPHandler;
-        $handler->setFormatter($this->getIdentityFormatter());
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::WARNING));
-
-        $handler2 = new TestFirePHPHandler;
-        $handler2->setFormatter($this->getIdentityFormatter());
-        $handler2->handle($this->getRecord(Logger::DEBUG));
-        $handler2->handle($this->getRecord(Logger::WARNING));
-
-        $expected = array(
-            'X-Wf-Protocol-1'    => 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2',
-            'X-Wf-1-Structure-1' => 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1',
-            'X-Wf-1-Plugin-1'    => 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3',
-            'X-Wf-1-1-1-1'       => 'test',
-            'X-Wf-1-1-1-2'       => 'test',
-        );
-
-        $expected2 = array(
-            'X-Wf-1-1-1-3'       => 'test',
-            'X-Wf-1-1-1-4'       => 'test',
-        );
-
-        $this->assertEquals($expected, $handler->getHeaders());
-        $this->assertEquals($expected2, $handler2->getHeaders());
-    }
-}
-
-class TestFirePHPHandler extends FirePHPHandler
-{
-    protected $headers = array();
-
-    public static function resetStatic()
-    {
-        self::$initialized = false;
-        self::$sendHeaders = true;
-        self::$messageIndex = 1;
-    }
-
-    protected function sendHeader($header, $content)
-    {
-        $this->headers[$header] = $content;
-    }
-
-    public function getHeaders()
-    {
-        return $this->headers;
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/FleepHookHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/FleepHookHandlerTest.php
deleted file mode 100644
index 91cdd31..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/FleepHookHandlerTest.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\Formatter\LineFormatter;
-use Monolog\Logger;
-use Monolog\TestCase;
-
-/**
- * @coversDefaultClass \Monolog\Handler\FleepHookHandler
- */
-class FleepHookHandlerTest extends TestCase
-{
-    /**
-     * Default token to use in tests
-     */
-    const TOKEN = '123abc';
-
-    /**
-     * @var FleepHookHandler
-     */
-    private $handler;
-
-    public function setUp()
-    {
-        parent::setUp();
-
-        if (!extension_loaded('openssl')) {
-            $this->markTestSkipped('This test requires openssl extension to run');
-        }
-
-        // Create instances of the handler and logger for convenience
-        $this->handler = new FleepHookHandler(self::TOKEN);
-    }
-
-    /**
-     * @covers ::__construct
-     */
-    public function testConstructorSetsExpectedDefaults()
-    {
-        $this->assertEquals(Logger::DEBUG, $this->handler->getLevel());
-        $this->assertEquals(true, $this->handler->getBubble());
-    }
-
-    /**
-     * @covers ::getDefaultFormatter
-     */
-    public function testHandlerUsesLineFormatterWhichIgnoresEmptyArrays()
-    {
-        $record = array(
-            'message' => 'msg',
-            'context' => array(),
-            'level' => Logger::DEBUG,
-            'level_name' => Logger::getLevelName(Logger::DEBUG),
-            'channel' => 'channel',
-            'datetime' => new \DateTime(),
-            'extra' => array(),
-        );
-
-        $expectedFormatter = new LineFormatter(null, null, true, true);
-        $expected = $expectedFormatter->format($record);
-
-        $handlerFormatter = $this->handler->getFormatter();
-        $actual = $handlerFormatter->format($record);
-
-        $this->assertEquals($expected, $actual, 'Empty context and extra arrays should not be rendered');
-    }
-
-    /**
-     * @covers ::__construct
-     */
-    public function testConnectionStringisConstructedCorrectly()
-    {
-        $this->assertEquals('ssl://' . FleepHookHandler::FLEEP_HOST . ':443', $this->handler->getConnectionString());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/FlowdockHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/FlowdockHandlerTest.php
deleted file mode 100644
index 4b120d5..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/FlowdockHandlerTest.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\Formatter\FlowdockFormatter;
-use Monolog\TestCase;
-use Monolog\Logger;
-
-/**
- * @author Dominik Liebler <liebler.dominik@gmail.com>
- * @see    https://www.hipchat.com/docs/api
- */
-class FlowdockHandlerTest extends TestCase
-{
-    /**
-     * @var resource
-     */
-    private $res;
-
-    /**
-     * @var FlowdockHandler
-     */
-    private $handler;
-
-    public function setUp()
-    {
-        if (!extension_loaded('openssl')) {
-            $this->markTestSkipped('This test requires openssl to run');
-        }
-    }
-
-    public function testWriteHeader()
-    {
-        $this->createHandler();
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/POST \/v1\/messages\/team_inbox\/.* HTTP\/1.1\\r\\nHost: api.flowdock.com\\r\\nContent-Type: application\/json\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content);
-
-        return $content;
-    }
-
-    /**
-     * @depends testWriteHeader
-     */
-    public function testWriteContent($content)
-    {
-        $this->assertRegexp('/"source":"test_source"/', $content);
-        $this->assertRegexp('/"from_address":"source@test\.com"/', $content);
-    }
-
-    private function createHandler($token = 'myToken')
-    {
-        $constructorArgs = array($token, Logger::DEBUG);
-        $this->res = fopen('php://memory', 'a');
-        $this->handler = $this->getMock(
-            '\Monolog\Handler\FlowdockHandler',
-            array('fsockopen', 'streamSetTimeout', 'closeSocket'),
-            $constructorArgs
-        );
-
-        $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($this->handler, 'localhost:1234');
-
-        $this->handler->expects($this->any())
-            ->method('fsockopen')
-            ->will($this->returnValue($this->res));
-        $this->handler->expects($this->any())
-            ->method('streamSetTimeout')
-            ->will($this->returnValue(true));
-        $this->handler->expects($this->any())
-            ->method('closeSocket')
-            ->will($this->returnValue(true));
-
-        $this->handler->setFormatter(new FlowdockFormatter('test_source', 'source@test.com'));
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerLegacyTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerLegacyTest.php
deleted file mode 100644
index 9d007b1..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerLegacyTest.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Gelf\Message;
-use Monolog\TestCase;
-use Monolog\Logger;
-use Monolog\Formatter\GelfMessageFormatter;
-
-class GelfHandlerLegacyTest extends TestCase
-{
-    public function setUp()
-    {
-        if (!class_exists('Gelf\MessagePublisher') || !class_exists('Gelf\Message')) {
-            $this->markTestSkipped("mlehner/gelf-php not installed");
-        }
-
-        require_once __DIR__ . '/GelfMockMessagePublisher.php';
-    }
-
-    /**
-     * @covers Monolog\Handler\GelfHandler::__construct
-     */
-    public function testConstruct()
-    {
-        $handler = new GelfHandler($this->getMessagePublisher());
-        $this->assertInstanceOf('Monolog\Handler\GelfHandler', $handler);
-    }
-
-    protected function getHandler($messagePublisher)
-    {
-        $handler = new GelfHandler($messagePublisher);
-
-        return $handler;
-    }
-
-    protected function getMessagePublisher()
-    {
-        return new GelfMockMessagePublisher('localhost');
-    }
-
-    public function testDebug()
-    {
-        $messagePublisher = $this->getMessagePublisher();
-        $handler = $this->getHandler($messagePublisher);
-
-        $record = $this->getRecord(Logger::DEBUG, "A test debug message");
-        $handler->handle($record);
-
-        $this->assertEquals(7, $messagePublisher->lastMessage->getLevel());
-        $this->assertEquals('test', $messagePublisher->lastMessage->getFacility());
-        $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage());
-        $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage());
-    }
-
-    public function testWarning()
-    {
-        $messagePublisher = $this->getMessagePublisher();
-        $handler = $this->getHandler($messagePublisher);
-
-        $record = $this->getRecord(Logger::WARNING, "A test warning message");
-        $handler->handle($record);
-
-        $this->assertEquals(4, $messagePublisher->lastMessage->getLevel());
-        $this->assertEquals('test', $messagePublisher->lastMessage->getFacility());
-        $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage());
-        $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage());
-    }
-
-    public function testInjectedGelfMessageFormatter()
-    {
-        $messagePublisher = $this->getMessagePublisher();
-        $handler = $this->getHandler($messagePublisher);
-
-        $handler->setFormatter(new GelfMessageFormatter('mysystem', 'EXT', 'CTX'));
-
-        $record = $this->getRecord(Logger::WARNING, "A test warning message");
-        $record['extra']['blarg'] = 'yep';
-        $record['context']['from'] = 'logger';
-        $handler->handle($record);
-
-        $this->assertEquals('mysystem', $messagePublisher->lastMessage->getHost());
-        $this->assertArrayHasKey('_EXTblarg', $messagePublisher->lastMessage->toArray());
-        $this->assertArrayHasKey('_CTXfrom', $messagePublisher->lastMessage->toArray());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php
deleted file mode 100644
index 8cdd64f..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Gelf\Message;
-use Monolog\TestCase;
-use Monolog\Logger;
-use Monolog\Formatter\GelfMessageFormatter;
-
-class GelfHandlerTest extends TestCase
-{
-    public function setUp()
-    {
-        if (!class_exists('Gelf\Publisher') || !class_exists('Gelf\Message')) {
-            $this->markTestSkipped("graylog2/gelf-php not installed");
-        }
-    }
-
-    /**
-     * @covers Monolog\Handler\GelfHandler::__construct
-     */
-    public function testConstruct()
-    {
-        $handler = new GelfHandler($this->getMessagePublisher());
-        $this->assertInstanceOf('Monolog\Handler\GelfHandler', $handler);
-    }
-
-    protected function getHandler($messagePublisher)
-    {
-        $handler = new GelfHandler($messagePublisher);
-
-        return $handler;
-    }
-
-    protected function getMessagePublisher()
-    {
-        return $this->getMock('Gelf\Publisher', array('publish'), array(), '', false);
-    }
-
-    public function testDebug()
-    {
-        $record = $this->getRecord(Logger::DEBUG, "A test debug message");
-        $expectedMessage = new Message();
-        $expectedMessage
-            ->setLevel(7)
-            ->setFacility("test")
-            ->setShortMessage($record['message'])
-            ->setTimestamp($record['datetime'])
-        ;
-
-        $messagePublisher = $this->getMessagePublisher();
-        $messagePublisher->expects($this->once())
-            ->method('publish')
-            ->with($expectedMessage);
-
-        $handler = $this->getHandler($messagePublisher);
-
-        $handler->handle($record);
-    }
-
-    public function testWarning()
-    {
-        $record = $this->getRecord(Logger::WARNING, "A test warning message");
-        $expectedMessage = new Message();
-        $expectedMessage
-            ->setLevel(4)
-            ->setFacility("test")
-            ->setShortMessage($record['message'])
-            ->setTimestamp($record['datetime'])
-        ;
-
-        $messagePublisher = $this->getMessagePublisher();
-        $messagePublisher->expects($this->once())
-            ->method('publish')
-            ->with($expectedMessage);
-
-        $handler = $this->getHandler($messagePublisher);
-
-        $handler->handle($record);
-    }
-
-    public function testInjectedGelfMessageFormatter()
-    {
-        $record = $this->getRecord(Logger::WARNING, "A test warning message");
-        $record['extra']['blarg'] = 'yep';
-        $record['context']['from'] = 'logger';
-
-        $expectedMessage = new Message();
-        $expectedMessage
-            ->setLevel(4)
-            ->setFacility("test")
-            ->setHost("mysystem")
-            ->setShortMessage($record['message'])
-            ->setTimestamp($record['datetime'])
-            ->setAdditional("EXTblarg", 'yep')
-            ->setAdditional("CTXfrom", 'logger')
-        ;
-
-        $messagePublisher = $this->getMessagePublisher();
-        $messagePublisher->expects($this->once())
-            ->method('publish')
-            ->with($expectedMessage);
-
-        $handler = $this->getHandler($messagePublisher);
-        $handler->setFormatter(new GelfMessageFormatter('mysystem', 'EXT', 'CTX'));
-        $handler->handle($record);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/GelfMockMessagePublisher.php b/vendor/monolog/monolog/tests/Monolog/Handler/GelfMockMessagePublisher.php
deleted file mode 100644
index 873d92f..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/GelfMockMessagePublisher.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Gelf\MessagePublisher;
-use Gelf\Message;
-
-class GelfMockMessagePublisher extends MessagePublisher
-{
-    public function publish(Message $message)
-    {
-        $this->lastMessage = $message;
-    }
-
-    public $lastMessage = null;
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php
deleted file mode 100644
index a1b8617..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-class GroupHandlerTest extends TestCase
-{
-    /**
-     * @covers Monolog\Handler\GroupHandler::__construct
-     * @expectedException InvalidArgumentException
-     */
-    public function testConstructorOnlyTakesHandler()
-    {
-        new GroupHandler(array(new TestHandler(), "foo"));
-    }
-
-    /**
-     * @covers Monolog\Handler\GroupHandler::__construct
-     * @covers Monolog\Handler\GroupHandler::handle
-     */
-    public function testHandle()
-    {
-        $testHandlers = array(new TestHandler(), new TestHandler());
-        $handler = new GroupHandler($testHandlers);
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::INFO));
-        foreach ($testHandlers as $test) {
-            $this->assertTrue($test->hasDebugRecords());
-            $this->assertTrue($test->hasInfoRecords());
-            $this->assertTrue(count($test->getRecords()) === 2);
-        }
-    }
-
-    /**
-     * @covers Monolog\Handler\GroupHandler::handleBatch
-     */
-    public function testHandleBatch()
-    {
-        $testHandlers = array(new TestHandler(), new TestHandler());
-        $handler = new GroupHandler($testHandlers);
-        $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO)));
-        foreach ($testHandlers as $test) {
-            $this->assertTrue($test->hasDebugRecords());
-            $this->assertTrue($test->hasInfoRecords());
-            $this->assertTrue(count($test->getRecords()) === 2);
-        }
-    }
-
-    /**
-     * @covers Monolog\Handler\GroupHandler::isHandling
-     */
-    public function testIsHandling()
-    {
-        $testHandlers = array(new TestHandler(Logger::ERROR), new TestHandler(Logger::WARNING));
-        $handler = new GroupHandler($testHandlers);
-        $this->assertTrue($handler->isHandling($this->getRecord(Logger::ERROR)));
-        $this->assertTrue($handler->isHandling($this->getRecord(Logger::WARNING)));
-        $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));
-    }
-
-    /**
-     * @covers Monolog\Handler\GroupHandler::handle
-     */
-    public function testHandleUsesProcessors()
-    {
-        $test = new TestHandler();
-        $handler = new GroupHandler(array($test));
-        $handler->pushProcessor(function ($record) {
-            $record['extra']['foo'] = true;
-
-            return $record;
-        });
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $this->assertTrue($test->hasWarningRecords());
-        $records = $test->getRecords();
-        $this->assertTrue($records[0]['extra']['foo']);
-    }
-
-    /**
-     * @covers Monolog\Handler\GroupHandler::handle
-     */
-    public function testHandleBatchUsesProcessors()
-    {
-        $testHandlers = array(new TestHandler(), new TestHandler());
-        $handler = new GroupHandler($testHandlers);
-        $handler->pushProcessor(function ($record) {
-            $record['extra']['foo'] = true;
-
-            return $record;
-        });
-        $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO)));
-        foreach ($testHandlers as $test) {
-            $this->assertTrue($test->hasDebugRecords());
-            $this->assertTrue($test->hasInfoRecords());
-            $this->assertTrue(count($test->getRecords()) === 2);
-            $records = $test->getRecords();
-            $this->assertTrue($records[0]['extra']['foo']);
-            $this->assertTrue($records[1]['extra']['foo']);
-        }
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/HandlerWrapperTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/HandlerWrapperTest.php
deleted file mode 100644
index d8d0452..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/HandlerWrapperTest.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-
-/**
- * @author Alexey Karapetov <alexey@karapetov.com>
- */
-class HandlerWrapperTest extends TestCase
-{
-    /**
-     * @var HandlerWrapper
-     */
-    private $wrapper;
-
-    private $handler;
-
-    public function setUp()
-    {
-        parent::setUp();
-        $this->handler = $this->getMock('Monolog\\Handler\\HandlerInterface');
-        $this->wrapper = new HandlerWrapper($this->handler);
-    }
-
-    /**
-     * @return array
-     */
-    public function trueFalseDataProvider()
-    {
-        return array(
-            array(true),
-            array(false),
-        );
-    }
-
-    /**
-     * @param $result
-     * @dataProvider trueFalseDataProvider
-     */
-    public function testIsHandling($result)
-    {
-        $record = $this->getRecord();
-        $this->handler->expects($this->once())
-            ->method('isHandling')
-            ->with($record)
-            ->willReturn($result);
-
-        $this->assertEquals($result, $this->wrapper->isHandling($record));
-    }
-
-    /**
-     * @param $result
-     * @dataProvider trueFalseDataProvider
-     */
-    public function testHandle($result)
-    {
-        $record = $this->getRecord();
-        $this->handler->expects($this->once())
-            ->method('handle')
-            ->with($record)
-            ->willReturn($result);
-
-        $this->assertEquals($result, $this->wrapper->handle($record));
-    }
-
-    /**
-     * @param $result
-     * @dataProvider trueFalseDataProvider
-     */
-    public function testHandleBatch($result)
-    {
-        $records = $this->getMultipleRecords();
-        $this->handler->expects($this->once())
-            ->method('handleBatch')
-            ->with($records)
-            ->willReturn($result);
-
-        $this->assertEquals($result, $this->wrapper->handleBatch($records));
-    }
-
-    public function testPushProcessor()
-    {
-        $processor = function () {};
-        $this->handler->expects($this->once())
-            ->method('pushProcessor')
-            ->with($processor);
-
-        $this->assertEquals($this->wrapper, $this->wrapper->pushProcessor($processor));
-    }
-
-    public function testPopProcessor()
-    {
-        $processor = function () {};
-        $this->handler->expects($this->once())
-            ->method('popProcessor')
-            ->willReturn($processor);
-
-        $this->assertEquals($processor, $this->wrapper->popProcessor());
-    }
-
-    public function testSetFormatter()
-    {
-        $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');
-        $this->handler->expects($this->once())
-            ->method('setFormatter')
-            ->with($formatter);
-
-        $this->assertEquals($this->wrapper, $this->wrapper->setFormatter($formatter));
-    }
-
-    public function testGetFormatter()
-    {
-        $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');
-        $this->handler->expects($this->once())
-            ->method('getFormatter')
-            ->willReturn($formatter);
-
-        $this->assertEquals($formatter, $this->wrapper->getFormatter());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php
deleted file mode 100644
index 52dc9da..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php
+++ /dev/null
@@ -1,279 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-/**
- * @author Rafael Dohms <rafael@doh.ms>
- * @see    https://www.hipchat.com/docs/api
- */
-class HipChatHandlerTest extends TestCase
-{
-    private $res;
-    /** @var  HipChatHandler */
-    private $handler;
-
-    public function testWriteHeader()
-    {
-        $this->createHandler();
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/POST \/v1\/rooms\/message\?format=json&auth_token=.* HTTP\/1.1\\r\\nHost: api.hipchat.com\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content);
-
-        return $content;
-    }
-
-    public function testWriteCustomHostHeader()
-    {
-        $this->createHandler('myToken', 'room1', 'Monolog', true, 'hipchat.foo.bar');
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/POST \/v1\/rooms\/message\?format=json&auth_token=.* HTTP\/1.1\\r\\nHost: hipchat.foo.bar\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content);
-
-        return $content;
-    }
-
-    public function testWriteV2()
-    {
-        $this->createHandler('myToken', 'room1', 'Monolog', false, 'hipchat.foo.bar', 'v2');
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/POST \/v2\/room\/room1\/notification\?auth_token=.* HTTP\/1.1\\r\\nHost: hipchat.foo.bar\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content);
-
-        return $content;
-    }
-
-    public function testWriteV2Notify()
-    {
-        $this->createHandler('myToken', 'room1', 'Monolog', true, 'hipchat.foo.bar', 'v2');
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/POST \/v2\/room\/room1\/notification\?auth_token=.* HTTP\/1.1\\r\\nHost: hipchat.foo.bar\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content);
-
-        return $content;
-    }
-
-    public function testRoomSpaces()
-    {
-        $this->createHandler('myToken', 'room name', 'Monolog', false, 'hipchat.foo.bar', 'v2');
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/POST \/v2\/room\/room%20name\/notification\?auth_token=.* HTTP\/1.1\\r\\nHost: hipchat.foo.bar\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content);
-
-        return $content;
-    }
-
-    /**
-     * @depends testWriteHeader
-     */
-    public function testWriteContent($content)
-    {
-        $this->assertRegexp('/notify=0&message=test1&message_format=text&color=red&room_id=room1&from=Monolog$/', $content);
-    }
-
-    public function testWriteContentV1WithoutName()
-    {
-        $this->createHandler('myToken', 'room1', null, false, 'hipchat.foo.bar', 'v1');
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/notify=0&message=test1&message_format=text&color=red&room_id=room1&from=$/', $content);
-
-        return $content;
-    }
-
-    /**
-     * @depends testWriteCustomHostHeader
-     */
-    public function testWriteContentNotify($content)
-    {
-        $this->assertRegexp('/notify=1&message=test1&message_format=text&color=red&room_id=room1&from=Monolog$/', $content);
-    }
-
-    /**
-     * @depends testWriteV2
-     */
-    public function testWriteContentV2($content)
-    {
-        $this->assertRegexp('/notify=false&message=test1&message_format=text&color=red&from=Monolog$/', $content);
-    }
-
-    /**
-     * @depends testWriteV2Notify
-     */
-    public function testWriteContentV2Notify($content)
-    {
-        $this->assertRegexp('/notify=true&message=test1&message_format=text&color=red&from=Monolog$/', $content);
-    }
-
-    public function testWriteContentV2WithoutName()
-    {
-        $this->createHandler('myToken', 'room1', null, false, 'hipchat.foo.bar', 'v2');
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/notify=false&message=test1&message_format=text&color=red$/', $content);
-
-        return $content;
-    }
-
-    public function testWriteWithComplexMessage()
-    {
-        $this->createHandler();
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Backup of database "example" finished in 16 minutes.'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/message=Backup\+of\+database\+%22example%22\+finished\+in\+16\+minutes\./', $content);
-    }
-
-    public function testWriteTruncatesLongMessage()
-    {
-        $this->createHandler();
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, str_repeat('abcde', 2000)));
-        fseek($this->res, 0);
-        $content = fread($this->res, 12000);
-
-        $this->assertRegexp('/message='.str_repeat('abcde', 1900).'\+%5Btruncated%5D/', $content);
-    }
-
-    /**
-     * @dataProvider provideLevelColors
-     */
-    public function testWriteWithErrorLevelsAndColors($level, $expectedColor)
-    {
-        $this->createHandler();
-        $this->handler->handle($this->getRecord($level, 'Backup of database "example" finished in 16 minutes.'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/color='.$expectedColor.'/', $content);
-    }
-
-    public function provideLevelColors()
-    {
-        return array(
-            array(Logger::DEBUG,    'gray'),
-            array(Logger::INFO,     'green'),
-            array(Logger::WARNING,  'yellow'),
-            array(Logger::ERROR,    'red'),
-            array(Logger::CRITICAL, 'red'),
-            array(Logger::ALERT,    'red'),
-            array(Logger::EMERGENCY,'red'),
-            array(Logger::NOTICE,   'green'),
-        );
-    }
-
-    /**
-     * @dataProvider provideBatchRecords
-     */
-    public function testHandleBatch($records, $expectedColor)
-    {
-        $this->createHandler();
-
-        $this->handler->handleBatch($records);
-
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/color='.$expectedColor.'/', $content);
-    }
-
-    public function provideBatchRecords()
-    {
-        return array(
-            array(
-                array(
-                    array('level' => Logger::WARNING, 'message' => 'Oh bugger!', 'level_name' => 'warning', 'datetime' => new \DateTime()),
-                    array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()),
-                    array('level' => Logger::CRITICAL, 'message' => 'Everything is broken!', 'level_name' => 'critical', 'datetime' => new \DateTime()),
-                ),
-                'red',
-            ),
-            array(
-                array(
-                    array('level' => Logger::WARNING, 'message' => 'Oh bugger!', 'level_name' => 'warning', 'datetime' => new \DateTime()),
-                    array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()),
-                ),
-                'yellow',
-            ),
-            array(
-                array(
-                    array('level' => Logger::DEBUG, 'message' => 'Just debugging.', 'level_name' => 'debug', 'datetime' => new \DateTime()),
-                    array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()),
-                ),
-                'green',
-            ),
-            array(
-                array(
-                    array('level' => Logger::DEBUG, 'message' => 'Just debugging.', 'level_name' => 'debug', 'datetime' => new \DateTime()),
-                ),
-                'gray',
-            ),
-        );
-    }
-
-    private function createHandler($token = 'myToken', $room = 'room1', $name = 'Monolog', $notify = false, $host = 'api.hipchat.com', $version = 'v1')
-    {
-        $constructorArgs = array($token, $room, $name, $notify, Logger::DEBUG, true, true, 'text', $host, $version);
-        $this->res = fopen('php://memory', 'a');
-        $this->handler = $this->getMock(
-            '\Monolog\Handler\HipChatHandler',
-            array('fsockopen', 'streamSetTimeout', 'closeSocket'),
-            $constructorArgs
-        );
-
-        $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($this->handler, 'localhost:1234');
-
-        $this->handler->expects($this->any())
-            ->method('fsockopen')
-            ->will($this->returnValue($this->res));
-        $this->handler->expects($this->any())
-            ->method('streamSetTimeout')
-            ->will($this->returnValue(true));
-        $this->handler->expects($this->any())
-            ->method('closeSocket')
-            ->will($this->returnValue(true));
-
-        $this->handler->setFormatter($this->getIdentityFormatter());
-    }
-
-    /**
-     * @expectedException InvalidArgumentException
-     */
-    public function testCreateWithTooLongName()
-    {
-        $hipChatHandler = new HipChatHandler('token', 'room', 'SixteenCharsHere');
-    }
-
-    public function testCreateWithTooLongNameV2()
-    {
-        // creating a handler with too long of a name but using the v2 api doesn't matter.
-        $hipChatHandler = new HipChatHandler('token', 'room', 'SixteenCharsHere', false, Logger::CRITICAL, true, true, 'test', 'api.hipchat.com', 'v2');
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/InsightOpsHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/InsightOpsHandlerTest.php
deleted file mode 100644
index 97c18b5..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/InsightOpsHandlerTest.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
- namespace Monolog\Handler;
- 
- use Monolog\TestCase;
- use Monolog\Logger;
-
-/**
- * @author Robert Kaufmann III <rok3@rok3.me>
- * @author Gabriel Machado <gabriel.ms1@hotmail.com>
- */
-class InsightOpsHandlerTest extends TestCase
-{
-    /**
-     * @var resource
-     */
-    private $resource;
-
-    /**
-     * @var LogEntriesHandler
-     */
-    private $handler;
-
-    public function testWriteContent()
-    {
-        $this->createHandler();
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Critical write test'));
-
-        fseek($this->resource, 0);
-        $content = fread($this->resource, 1024);
-
-        $this->assertRegexp('/testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] test.CRITICAL: Critical write test/', $content);
-    }
-
-    public function testWriteBatchContent()
-    {
-        $this->createHandler();
-        $this->handler->handleBatch($this->getMultipleRecords());
-
-        fseek($this->resource, 0);
-        $content = fread($this->resource, 1024);
-
-        $this->assertRegexp('/(testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] .* \[\] \[\]\n){3}/', $content);
-    }
-
-    private function createHandler()
-    {
-        $useSSL = extension_loaded('openssl');
-        $args = array('testToken', 'us', $useSSL, Logger::DEBUG, true);
-        $this->resource = fopen('php://memory', 'a');
-        $this->handler = $this->getMock(
-            '\Monolog\Handler\InsightOpsHandler',
-            array('fsockopen', 'streamSetTimeout', 'closeSocket'),
-            $args
-        );
-
-        $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($this->handler, 'localhost:1234');
-
-        $this->handler->expects($this->any())
-            ->method('fsockopen')
-            ->will($this->returnValue($this->resource));
-        $this->handler->expects($this->any())
-            ->method('streamSetTimeout')
-            ->will($this->returnValue(true));
-        $this->handler->expects($this->any())
-            ->method('closeSocket')
-            ->will($this->returnValue(true));
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php
deleted file mode 100644
index b2deb40..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-/**
- * @author Robert Kaufmann III <rok3@rok3.me>
- */
-class LogEntriesHandlerTest extends TestCase
-{
-    /**
-     * @var resource
-     */
-    private $res;
-
-    /**
-     * @var LogEntriesHandler
-     */
-    private $handler;
-
-    public function testWriteContent()
-    {
-        $this->createHandler();
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Critical write test'));
-
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] test.CRITICAL: Critical write test/', $content);
-    }
-
-    public function testWriteBatchContent()
-    {
-        $records = array(
-            $this->getRecord(),
-            $this->getRecord(),
-            $this->getRecord(),
-        );
-        $this->createHandler();
-        $this->handler->handleBatch($records);
-
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/(testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] .* \[\] \[\]\n){3}/', $content);
-    }
-
-    private function createHandler()
-    {
-        $useSSL = extension_loaded('openssl');
-        $args = array('testToken', $useSSL, Logger::DEBUG, true);
-        $this->res = fopen('php://memory', 'a');
-        $this->handler = $this->getMock(
-            '\Monolog\Handler\LogEntriesHandler',
-            array('fsockopen', 'streamSetTimeout', 'closeSocket'),
-            $args
-        );
-
-        $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($this->handler, 'localhost:1234');
-
-        $this->handler->expects($this->any())
-            ->method('fsockopen')
-            ->will($this->returnValue($this->res));
-        $this->handler->expects($this->any())
-            ->method('streamSetTimeout')
-            ->will($this->returnValue(true));
-        $this->handler->expects($this->any())
-            ->method('closeSocket')
-            ->will($this->returnValue(true));
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php
deleted file mode 100644
index 6754f3d..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\Logger;
-use Monolog\TestCase;
-
-class MailHandlerTest extends TestCase
-{
-    /**
-     * @covers Monolog\Handler\MailHandler::handleBatch
-     */
-    public function testHandleBatch()
-    {
-        $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');
-        $formatter->expects($this->once())
-            ->method('formatBatch'); // Each record is formatted
-
-        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler');
-        $handler->expects($this->once())
-            ->method('send');
-        $handler->expects($this->never())
-            ->method('write'); // write is for individual records
-
-        $handler->setFormatter($formatter);
-
-        $handler->handleBatch($this->getMultipleRecords());
-    }
-
-    /**
-     * @covers Monolog\Handler\MailHandler::handleBatch
-     */
-    public function testHandleBatchNotSendsMailIfMessagesAreBelowLevel()
-    {
-        $records = array(
-            $this->getRecord(Logger::DEBUG, 'debug message 1'),
-            $this->getRecord(Logger::DEBUG, 'debug message 2'),
-            $this->getRecord(Logger::INFO, 'information'),
-        );
-
-        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler');
-        $handler->expects($this->never())
-            ->method('send');
-        $handler->setLevel(Logger::ERROR);
-
-        $handler->handleBatch($records);
-    }
-
-    /**
-     * @covers Monolog\Handler\MailHandler::write
-     */
-    public function testHandle()
-    {
-        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler');
-
-        $record = $this->getRecord();
-        $records = array($record);
-        $records[0]['formatted'] = '['.$record['datetime']->format('Y-m-d H:i:s').'] test.WARNING: test [] []'."\n";
-
-        $handler->expects($this->once())
-            ->method('send')
-            ->with($records[0]['formatted'], $records);
-
-        $handler->handle($record);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php b/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php
deleted file mode 100644
index a083322..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Raven_Client;
-
-class MockRavenClient extends Raven_Client
-{
-    public function capture($data, $stack, $vars = null)
-    {
-        $data = array_merge($this->get_user_data(), $data);
-        $this->lastData = $data;
-        $this->lastStack = $stack;
-    }
-
-    public $lastData;
-    public $lastStack;
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php
deleted file mode 100644
index 0fdef63..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-class MongoDBHandlerTest extends TestCase
-{
-    /**
-     * @expectedException InvalidArgumentException
-     */
-    public function testConstructorShouldThrowExceptionForInvalidMongo()
-    {
-        new MongoDBHandler(new \stdClass(), 'DB', 'Collection');
-    }
-
-    public function testHandle()
-    {
-        $mongo = $this->getMock('Mongo', array('selectCollection'), array(), '', false);
-        $collection = $this->getMock('stdClass', array('save'));
-
-        $mongo->expects($this->once())
-            ->method('selectCollection')
-            ->with('DB', 'Collection')
-            ->will($this->returnValue($collection));
-
-        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34));
-
-        $expected = array(
-            'message' => 'test',
-            'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34),
-            'level' => Logger::WARNING,
-            'level_name' => 'WARNING',
-            'channel' => 'test',
-            'datetime' => $record['datetime']->format('Y-m-d H:i:s'),
-            'extra' => array(),
-        );
-
-        $collection->expects($this->once())
-            ->method('save')
-            ->with($expected);
-
-        $handler = new MongoDBHandler($mongo, 'DB', 'Collection');
-        $handler->handle($record);
-    }
-}
-
-if (!class_exists('Mongo')) {
-    class Mongo
-    {
-        public function selectCollection()
-        {
-        }
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php
deleted file mode 100644
index ddf545d..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-use InvalidArgumentException;
-
-function mail($to, $subject, $message, $additional_headers = null, $additional_parameters = null)
-{
-    $GLOBALS['mail'][] = func_get_args();
-}
-
-class NativeMailerHandlerTest extends TestCase
-{
-    protected function setUp()
-    {
-        $GLOBALS['mail'] = array();
-    }
-
-    /**
-     * @expectedException InvalidArgumentException
-     */
-    public function testConstructorHeaderInjection()
-    {
-        $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', "receiver@example.org\r\nFrom: faked@attacker.org");
-    }
-
-    /**
-     * @expectedException InvalidArgumentException
-     */
-    public function testSetterHeaderInjection()
-    {
-        $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org');
-        $mailer->addHeader("Content-Type: text/html\r\nFrom: faked@attacker.org");
-    }
-
-    /**
-     * @expectedException InvalidArgumentException
-     */
-    public function testSetterArrayHeaderInjection()
-    {
-        $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org');
-        $mailer->addHeader(array("Content-Type: text/html\r\nFrom: faked@attacker.org"));
-    }
-
-    /**
-     * @expectedException InvalidArgumentException
-     */
-    public function testSetterContentTypeInjection()
-    {
-        $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org');
-        $mailer->setContentType("text/html\r\nFrom: faked@attacker.org");
-    }
-
-    /**
-     * @expectedException InvalidArgumentException
-     */
-    public function testSetterEncodingInjection()
-    {
-        $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org');
-        $mailer->setEncoding("utf-8\r\nFrom: faked@attacker.org");
-    }
-
-    public function testSend()
-    {
-        $to = 'spammer@example.org';
-        $subject = 'dear victim';
-        $from = 'receiver@example.org';
-
-        $mailer = new NativeMailerHandler($to, $subject, $from);
-        $mailer->handleBatch(array());
-
-        // batch is empty, nothing sent
-        $this->assertEmpty($GLOBALS['mail']);
-
-        // non-empty batch
-        $mailer->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz"));
-        $this->assertNotEmpty($GLOBALS['mail']);
-        $this->assertInternalType('array', $GLOBALS['mail']);
-        $this->assertArrayHasKey('0', $GLOBALS['mail']);
-        $params = $GLOBALS['mail'][0];
-        $this->assertCount(5, $params);
-        $this->assertSame($to, $params[0]);
-        $this->assertSame($subject, $params[1]);
-        $this->assertStringEndsWith(" test.ERROR: Foo Bar  Baz [] []\n", $params[2]);
-        $this->assertSame("From: $from\r\nContent-type: text/plain; charset=utf-8\r\n", $params[3]);
-        $this->assertSame('', $params[4]);
-    }
-
-    public function testMessageSubjectFormatting()
-    {
-        $mailer = new NativeMailerHandler('to@example.org', 'Alert: %level_name% %message%', 'from@example.org');
-        $mailer->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz"));
-        $this->assertNotEmpty($GLOBALS['mail']);
-        $this->assertInternalType('array', $GLOBALS['mail']);
-        $this->assertArrayHasKey('0', $GLOBALS['mail']);
-        $params = $GLOBALS['mail'][0];
-        $this->assertCount(5, $params);
-        $this->assertSame('Alert: ERROR Foo Bar  Baz', $params[1]);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php
deleted file mode 100644
index 4d3a615..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php
+++ /dev/null
@@ -1,200 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\Formatter\LineFormatter;
-use Monolog\TestCase;
-use Monolog\Logger;
-
-class NewRelicHandlerTest extends TestCase
-{
-    public static $appname;
-    public static $customParameters;
-    public static $transactionName;
-
-    public function setUp()
-    {
-        self::$appname = null;
-        self::$customParameters = array();
-        self::$transactionName = null;
-    }
-
-    /**
-     * @expectedException Monolog\Handler\MissingExtensionException
-     */
-    public function testThehandlerThrowsAnExceptionIfTheNRExtensionIsNotLoaded()
-    {
-        $handler = new StubNewRelicHandlerWithoutExtension();
-        $handler->handle($this->getRecord(Logger::ERROR));
-    }
-
-    public function testThehandlerCanHandleTheRecord()
-    {
-        $handler = new StubNewRelicHandler();
-        $handler->handle($this->getRecord(Logger::ERROR));
-    }
-
-    public function testThehandlerCanAddContextParamsToTheNewRelicTrace()
-    {
-        $handler = new StubNewRelicHandler();
-        $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('a' => 'b')));
-        $this->assertEquals(array('context_a' => 'b'), self::$customParameters);
-    }
-
-    public function testThehandlerCanAddExplodedContextParamsToTheNewRelicTrace()
-    {
-        $handler = new StubNewRelicHandler(Logger::ERROR, true, self::$appname, true);
-        $handler->handle($this->getRecord(
-            Logger::ERROR,
-            'log message',
-            array('a' => array('key1' => 'value1', 'key2' => 'value2'))
-        ));
-        $this->assertEquals(
-            array('context_a_key1' => 'value1', 'context_a_key2' => 'value2'),
-            self::$customParameters
-        );
-    }
-
-    public function testThehandlerCanAddExtraParamsToTheNewRelicTrace()
-    {
-        $record = $this->getRecord(Logger::ERROR, 'log message');
-        $record['extra'] = array('c' => 'd');
-
-        $handler = new StubNewRelicHandler();
-        $handler->handle($record);
-
-        $this->assertEquals(array('extra_c' => 'd'), self::$customParameters);
-    }
-
-    public function testThehandlerCanAddExplodedExtraParamsToTheNewRelicTrace()
-    {
-        $record = $this->getRecord(Logger::ERROR, 'log message');
-        $record['extra'] = array('c' => array('key1' => 'value1', 'key2' => 'value2'));
-
-        $handler = new StubNewRelicHandler(Logger::ERROR, true, self::$appname, true);
-        $handler->handle($record);
-
-        $this->assertEquals(
-            array('extra_c_key1' => 'value1', 'extra_c_key2' => 'value2'),
-            self::$customParameters
-        );
-    }
-
-    public function testThehandlerCanAddExtraContextAndParamsToTheNewRelicTrace()
-    {
-        $record = $this->getRecord(Logger::ERROR, 'log message', array('a' => 'b'));
-        $record['extra'] = array('c' => 'd');
-
-        $handler = new StubNewRelicHandler();
-        $handler->handle($record);
-
-        $expected = array(
-            'context_a' => 'b',
-            'extra_c' => 'd',
-        );
-
-        $this->assertEquals($expected, self::$customParameters);
-    }
-
-    public function testThehandlerCanHandleTheRecordsFormattedUsingTheLineFormatter()
-    {
-        $handler = new StubNewRelicHandler();
-        $handler->setFormatter(new LineFormatter());
-        $handler->handle($this->getRecord(Logger::ERROR));
-    }
-
-    public function testTheAppNameIsNullByDefault()
-    {
-        $handler = new StubNewRelicHandler();
-        $handler->handle($this->getRecord(Logger::ERROR, 'log message'));
-
-        $this->assertEquals(null, self::$appname);
-    }
-
-    public function testTheAppNameCanBeInjectedFromtheConstructor()
-    {
-        $handler = new StubNewRelicHandler(Logger::DEBUG, false, 'myAppName');
-        $handler->handle($this->getRecord(Logger::ERROR, 'log message'));
-
-        $this->assertEquals('myAppName', self::$appname);
-    }
-
-    public function testTheAppNameCanBeOverriddenFromEachLog()
-    {
-        $handler = new StubNewRelicHandler(Logger::DEBUG, false, 'myAppName');
-        $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('appname' => 'logAppName')));
-
-        $this->assertEquals('logAppName', self::$appname);
-    }
-
-    public function testTheTransactionNameIsNullByDefault()
-    {
-        $handler = new StubNewRelicHandler();
-        $handler->handle($this->getRecord(Logger::ERROR, 'log message'));
-
-        $this->assertEquals(null, self::$transactionName);
-    }
-
-    public function testTheTransactionNameCanBeInjectedFromTheConstructor()
-    {
-        $handler = new StubNewRelicHandler(Logger::DEBUG, false, null, false, 'myTransaction');
-        $handler->handle($this->getRecord(Logger::ERROR, 'log message'));
-
-        $this->assertEquals('myTransaction', self::$transactionName);
-    }
-
-    public function testTheTransactionNameCanBeOverriddenFromEachLog()
-    {
-        $handler = new StubNewRelicHandler(Logger::DEBUG, false, null, false, 'myTransaction');
-        $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('transaction_name' => 'logTransactName')));
-
-        $this->assertEquals('logTransactName', self::$transactionName);
-    }
-}
-
-class StubNewRelicHandlerWithoutExtension extends NewRelicHandler
-{
-    protected function isNewRelicEnabled()
-    {
-        return false;
-    }
-}
-
-class StubNewRelicHandler extends NewRelicHandler
-{
-    protected function isNewRelicEnabled()
-    {
-        return true;
-    }
-}
-
-function newrelic_notice_error()
-{
-    return true;
-}
-
-function newrelic_set_appname($appname)
-{
-    return NewRelicHandlerTest::$appname = $appname;
-}
-
-function newrelic_name_transaction($transactionName)
-{
-    return NewRelicHandlerTest::$transactionName = $transactionName;
-}
-
-function newrelic_add_custom_parameter($key, $value)
-{
-    NewRelicHandlerTest::$customParameters[$key] = $value;
-
-    return true;
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php
deleted file mode 100644
index 292df78..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-/**
- * @covers Monolog\Handler\NullHandler::handle
- */
-class NullHandlerTest extends TestCase
-{
-    public function testHandle()
-    {
-        $handler = new NullHandler();
-        $this->assertTrue($handler->handle($this->getRecord()));
-    }
-
-    public function testHandleLowerLevelRecord()
-    {
-        $handler = new NullHandler(Logger::WARNING);
-        $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG)));
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/PHPConsoleHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/PHPConsoleHandlerTest.php
deleted file mode 100644
index 152573e..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/PHPConsoleHandlerTest.php
+++ /dev/null
@@ -1,273 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Exception;
-use Monolog\ErrorHandler;
-use Monolog\Logger;
-use Monolog\TestCase;
-use PhpConsole\Connector;
-use PhpConsole\Dispatcher\Debug as DebugDispatcher;
-use PhpConsole\Dispatcher\Errors as ErrorDispatcher;
-use PhpConsole\Handler;
-use PHPUnit_Framework_MockObject_MockObject;
-
-/**
- * @covers Monolog\Handler\PHPConsoleHandler
- * @author Sergey Barbushin https://www.linkedin.com/in/barbushin
- */
-class PHPConsoleHandlerTest extends TestCase
-{
-    /** @var  Connector|PHPUnit_Framework_MockObject_MockObject */
-    protected $connector;
-    /** @var  DebugDispatcher|PHPUnit_Framework_MockObject_MockObject */
-    protected $debugDispatcher;
-    /** @var  ErrorDispatcher|PHPUnit_Framework_MockObject_MockObject */
-    protected $errorDispatcher;
-
-    protected function setUp()
-    {
-        if (!class_exists('PhpConsole\Connector')) {
-            $this->markTestSkipped('PHP Console library not found. See https://github.com/barbushin/php-console#installation');
-        }
-        $this->connector = $this->initConnectorMock();
-
-        $this->debugDispatcher = $this->initDebugDispatcherMock($this->connector);
-        $this->connector->setDebugDispatcher($this->debugDispatcher);
-
-        $this->errorDispatcher = $this->initErrorDispatcherMock($this->connector);
-        $this->connector->setErrorsDispatcher($this->errorDispatcher);
-    }
-
-    protected function initDebugDispatcherMock(Connector $connector)
-    {
-        return $this->getMockBuilder('PhpConsole\Dispatcher\Debug')
-            ->disableOriginalConstructor()
-            ->setMethods(array('dispatchDebug'))
-            ->setConstructorArgs(array($connector, $connector->getDumper()))
-            ->getMock();
-    }
-
-    protected function initErrorDispatcherMock(Connector $connector)
-    {
-        return $this->getMockBuilder('PhpConsole\Dispatcher\Errors')
-            ->disableOriginalConstructor()
-            ->setMethods(array('dispatchError', 'dispatchException'))
-            ->setConstructorArgs(array($connector, $connector->getDumper()))
-            ->getMock();
-    }
-
-    protected function initConnectorMock()
-    {
-        $connector = $this->getMockBuilder('PhpConsole\Connector')
-            ->disableOriginalConstructor()
-            ->setMethods(array(
-                'sendMessage',
-                'onShutDown',
-                'isActiveClient',
-                'setSourcesBasePath',
-                'setServerEncoding',
-                'setPassword',
-                'enableSslOnlyMode',
-                'setAllowedIpMasks',
-                'setHeadersLimit',
-                'startEvalRequestsListener',
-            ))
-            ->getMock();
-
-        $connector->expects($this->any())
-            ->method('isActiveClient')
-            ->will($this->returnValue(true));
-
-        return $connector;
-    }
-
-    protected function getHandlerDefaultOption($name)
-    {
-        $handler = new PHPConsoleHandler(array(), $this->connector);
-        $options = $handler->getOptions();
-
-        return $options[$name];
-    }
-
-    protected function initLogger($handlerOptions = array(), $level = Logger::DEBUG)
-    {
-        return new Logger('test', array(
-            new PHPConsoleHandler($handlerOptions, $this->connector, $level),
-        ));
-    }
-
-    public function testInitWithDefaultConnector()
-    {
-        $handler = new PHPConsoleHandler();
-        $this->assertEquals(spl_object_hash(Connector::getInstance()), spl_object_hash($handler->getConnector()));
-    }
-
-    public function testInitWithCustomConnector()
-    {
-        $handler = new PHPConsoleHandler(array(), $this->connector);
-        $this->assertEquals(spl_object_hash($this->connector), spl_object_hash($handler->getConnector()));
-    }
-
-    public function testDebug()
-    {
-        $this->debugDispatcher->expects($this->once())->method('dispatchDebug')->with($this->equalTo('test'));
-        $this->initLogger()->addDebug('test');
-    }
-
-    public function testDebugContextInMessage()
-    {
-        $message = 'test';
-        $tag = 'tag';
-        $context = array($tag, 'custom' => mt_rand());
-        $expectedMessage = $message . ' ' . json_encode(array_slice($context, 1));
-        $this->debugDispatcher->expects($this->once())->method('dispatchDebug')->with(
-            $this->equalTo($expectedMessage),
-            $this->equalTo($tag)
-        );
-        $this->initLogger()->addDebug($message, $context);
-    }
-
-    public function testDebugTags($tagsContextKeys = null)
-    {
-        $expectedTags = mt_rand();
-        $logger = $this->initLogger($tagsContextKeys ? array('debugTagsKeysInContext' => $tagsContextKeys) : array());
-        if (!$tagsContextKeys) {
-            $tagsContextKeys = $this->getHandlerDefaultOption('debugTagsKeysInContext');
-        }
-        foreach ($tagsContextKeys as $key) {
-            $debugDispatcher = $this->initDebugDispatcherMock($this->connector);
-            $debugDispatcher->expects($this->once())->method('dispatchDebug')->with(
-                $this->anything(),
-                $this->equalTo($expectedTags)
-            );
-            $this->connector->setDebugDispatcher($debugDispatcher);
-            $logger->addDebug('test', array($key => $expectedTags));
-        }
-    }
-
-    public function testError($classesPartialsTraceIgnore = null)
-    {
-        $code = E_USER_NOTICE;
-        $message = 'message';
-        $file = __FILE__;
-        $line = __LINE__;
-        $this->errorDispatcher->expects($this->once())->method('dispatchError')->with(
-            $this->equalTo($code),
-            $this->equalTo($message),
-            $this->equalTo($file),
-            $this->equalTo($line),
-            $classesPartialsTraceIgnore ?: $this->equalTo($this->getHandlerDefaultOption('classesPartialsTraceIgnore'))
-        );
-        $errorHandler = ErrorHandler::register($this->initLogger($classesPartialsTraceIgnore ? array('classesPartialsTraceIgnore' => $classesPartialsTraceIgnore) : array()), false);
-        $errorHandler->registerErrorHandler(array(), false, E_USER_WARNING);
-        $errorHandler->handleError($code, $message, $file, $line);
-    }
-
-    public function testException()
-    {
-        $e = new Exception();
-        $this->errorDispatcher->expects($this->once())->method('dispatchException')->with(
-            $this->equalTo($e)
-        );
-        $handler = $this->initLogger();
-        $handler->log(
-            \Psr\Log\LogLevel::ERROR,
-            sprintf('Uncaught Exception %s: "%s" at %s line %s', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()),
-            array('exception' => $e)
-        );
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testWrongOptionsThrowsException()
-    {
-        new PHPConsoleHandler(array('xxx' => 1));
-    }
-
-    public function testOptionEnabled()
-    {
-        $this->debugDispatcher->expects($this->never())->method('dispatchDebug');
-        $this->initLogger(array('enabled' => false))->addDebug('test');
-    }
-
-    public function testOptionClassesPartialsTraceIgnore()
-    {
-        $this->testError(array('Class', 'Namespace\\'));
-    }
-
-    public function testOptionDebugTagsKeysInContext()
-    {
-        $this->testDebugTags(array('key1', 'key2'));
-    }
-
-    public function testOptionUseOwnErrorsAndExceptionsHandler()
-    {
-        $this->initLogger(array('useOwnErrorsHandler' => true, 'useOwnExceptionsHandler' => true));
-        $this->assertEquals(array(Handler::getInstance(), 'handleError'), set_error_handler(function () {
-        }));
-        $this->assertEquals(array(Handler::getInstance(), 'handleException'), set_exception_handler(function () {
-        }));
-    }
-
-    public static function provideConnectorMethodsOptionsSets()
-    {
-        return array(
-            array('sourcesBasePath', 'setSourcesBasePath', __DIR__),
-            array('serverEncoding', 'setServerEncoding', 'cp1251'),
-            array('password', 'setPassword', '******'),
-            array('enableSslOnlyMode', 'enableSslOnlyMode', true, false),
-            array('ipMasks', 'setAllowedIpMasks', array('127.0.0.*')),
-            array('headersLimit', 'setHeadersLimit', 2500),
-            array('enableEvalListener', 'startEvalRequestsListener', true, false),
-        );
-    }
-
-    /**
-     * @dataProvider provideConnectorMethodsOptionsSets
-     */
-    public function testOptionCallsConnectorMethod($option, $method, $value, $isArgument = true)
-    {
-        $expectCall = $this->connector->expects($this->once())->method($method);
-        if ($isArgument) {
-            $expectCall->with($value);
-        }
-        new PHPConsoleHandler(array($option => $value), $this->connector);
-    }
-
-    public function testOptionDetectDumpTraceAndSource()
-    {
-        new PHPConsoleHandler(array('detectDumpTraceAndSource' => true), $this->connector);
-        $this->assertTrue($this->connector->getDebugDispatcher()->detectTraceAndSource);
-    }
-
-    public static function provideDumperOptionsValues()
-    {
-        return array(
-            array('dumperLevelLimit', 'levelLimit', 1001),
-            array('dumperItemsCountLimit', 'itemsCountLimit', 1002),
-            array('dumperItemSizeLimit', 'itemSizeLimit', 1003),
-            array('dumperDumpSizeLimit', 'dumpSizeLimit', 1004),
-            array('dumperDetectCallbacks', 'detectCallbacks', true),
-        );
-    }
-
-    /**
-     * @dataProvider provideDumperOptionsValues
-     */
-    public function testDumperOptions($option, $dumperProperty, $value)
-    {
-        new PHPConsoleHandler(array($option => $value), $this->connector);
-        $this->assertEquals($value, $this->connector->getDumper()->$dumperProperty);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/PsrHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/PsrHandlerTest.php
deleted file mode 100644
index 64eaab1..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/PsrHandlerTest.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-/**
- * @covers Monolog\Handler\PsrHandler::handle
- */
-class PsrHandlerTest extends TestCase
-{
-    public function logLevelProvider()
-    {
-        $levels = array();
-        $monologLogger = new Logger('');
-
-        foreach ($monologLogger->getLevels() as $levelName => $level) {
-            $levels[] = array($levelName, $level);
-        }
-
-        return $levels;
-    }
-
-    /**
-     * @dataProvider logLevelProvider
-     */
-    public function testHandlesAllLevels($levelName, $level)
-    {
-        $message = 'Hello, world! ' . $level;
-        $context = array('foo' => 'bar', 'level' => $level);
-
-        $psrLogger = $this->getMock('Psr\Log\NullLogger');
-        $psrLogger->expects($this->once())
-            ->method('log')
-            ->with(strtolower($levelName), $message, $context);
-
-        $handler = new PsrHandler($psrLogger);
-        $handler->handle(array('level' => $level, 'level_name' => $levelName, 'message' => $message, 'context' => $context));
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php
deleted file mode 100644
index 56df474..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php
+++ /dev/null
@@ -1,141 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-/**
- * Almost all examples (expected header, titles, messages) taken from
- * https://www.pushover.net/api
- * @author Sebastian Göttschkes <sebastian.goettschkes@googlemail.com>
- * @see https://www.pushover.net/api
- */
-class PushoverHandlerTest extends TestCase
-{
-    private $res;
-    private $handler;
-
-    public function testWriteHeader()
-    {
-        $this->createHandler();
-        $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/POST \/1\/messages.json HTTP\/1.1\\r\\nHost: api.pushover.net\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content);
-
-        return $content;
-    }
-
-    /**
-     * @depends testWriteHeader
-     */
-    public function testWriteContent($content)
-    {
-        $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog&timestamp=\d{10}$/', $content);
-    }
-
-    public function testWriteWithComplexTitle()
-    {
-        $this->createHandler('myToken', 'myUser', 'Backup finished - SQL1');
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/title=Backup\+finished\+-\+SQL1/', $content);
-    }
-
-    public function testWriteWithComplexMessage()
-    {
-        $this->createHandler();
-        $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Backup of database "example" finished in 16 minutes.'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/message=Backup\+of\+database\+%22example%22\+finished\+in\+16\+minutes\./', $content);
-    }
-
-    public function testWriteWithTooLongMessage()
-    {
-        $message = str_pad('test', 520, 'a');
-        $this->createHandler();
-        $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, $message));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $expectedMessage = substr($message, 0, 505);
-
-        $this->assertRegexp('/message=' . $expectedMessage . '&title/', $content);
-    }
-
-    public function testWriteWithHighPriority()
-    {
-        $this->createHandler();
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog&timestamp=\d{10}&priority=1$/', $content);
-    }
-
-    public function testWriteWithEmergencyPriority()
-    {
-        $this->createHandler();
-        $this->handler->handle($this->getRecord(Logger::EMERGENCY, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog&timestamp=\d{10}&priority=2&retry=30&expire=25200$/', $content);
-    }
-
-    public function testWriteToMultipleUsers()
-    {
-        $this->createHandler('myToken', array('userA', 'userB'));
-        $this->handler->handle($this->getRecord(Logger::EMERGENCY, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/token=myToken&user=userA&message=test1&title=Monolog&timestamp=\d{10}&priority=2&retry=30&expire=25200POST/', $content);
-        $this->assertRegexp('/token=myToken&user=userB&message=test1&title=Monolog&timestamp=\d{10}&priority=2&retry=30&expire=25200$/', $content);
-    }
-
-    private function createHandler($token = 'myToken', $user = 'myUser', $title = 'Monolog')
-    {
-        $constructorArgs = array($token, $user, $title);
-        $this->res = fopen('php://memory', 'a');
-        $this->handler = $this->getMock(
-            '\Monolog\Handler\PushoverHandler',
-            array('fsockopen', 'streamSetTimeout', 'closeSocket'),
-            $constructorArgs
-        );
-
-        $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($this->handler, 'localhost:1234');
-
-        $this->handler->expects($this->any())
-            ->method('fsockopen')
-            ->will($this->returnValue($this->res));
-        $this->handler->expects($this->any())
-            ->method('streamSetTimeout')
-            ->will($this->returnValue(true));
-        $this->handler->expects($this->any())
-            ->method('closeSocket')
-            ->will($this->returnValue(true));
-
-        $this->handler->setFormatter($this->getIdentityFormatter());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php
deleted file mode 100644
index 26d212b..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php
+++ /dev/null
@@ -1,255 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-use Monolog\Formatter\LineFormatter;
-
-class RavenHandlerTest extends TestCase
-{
-    public function setUp()
-    {
-        if (!class_exists('Raven_Client')) {
-            $this->markTestSkipped('raven/raven not installed');
-        }
-
-        require_once __DIR__ . '/MockRavenClient.php';
-    }
-
-    /**
-     * @covers Monolog\Handler\RavenHandler::__construct
-     */
-    public function testConstruct()
-    {
-        $handler = new RavenHandler($this->getRavenClient());
-        $this->assertInstanceOf('Monolog\Handler\RavenHandler', $handler);
-    }
-
-    protected function getHandler($ravenClient)
-    {
-        $handler = new RavenHandler($ravenClient);
-
-        return $handler;
-    }
-
-    protected function getRavenClient()
-    {
-        $dsn = 'http://43f6017361224d098402974103bfc53d:a6a0538fc2934ba2bed32e08741b2cd3@marca.python.live.cheggnet.com:9000/1';
-
-        return new MockRavenClient($dsn);
-    }
-
-    public function testDebug()
-    {
-        $ravenClient = $this->getRavenClient();
-        $handler = $this->getHandler($ravenClient);
-
-        $record = $this->getRecord(Logger::DEBUG, 'A test debug message');
-        $handler->handle($record);
-
-        $this->assertEquals($ravenClient::DEBUG, $ravenClient->lastData['level']);
-        $this->assertContains($record['message'], $ravenClient->lastData['message']);
-    }
-
-    public function testWarning()
-    {
-        $ravenClient = $this->getRavenClient();
-        $handler = $this->getHandler($ravenClient);
-
-        $record = $this->getRecord(Logger::WARNING, 'A test warning message');
-        $handler->handle($record);
-
-        $this->assertEquals($ravenClient::WARNING, $ravenClient->lastData['level']);
-        $this->assertContains($record['message'], $ravenClient->lastData['message']);
-    }
-
-    public function testTag()
-    {
-        $ravenClient = $this->getRavenClient();
-        $handler = $this->getHandler($ravenClient);
-
-        $tags = array(1, 2, 'foo');
-        $record = $this->getRecord(Logger::INFO, 'test', array('tags' => $tags));
-        $handler->handle($record);
-
-        $this->assertEquals($tags, $ravenClient->lastData['tags']);
-    }
-
-    public function testExtraParameters()
-    {
-        $ravenClient = $this->getRavenClient();
-        $handler = $this->getHandler($ravenClient);
-
-        $checksum = '098f6bcd4621d373cade4e832627b4f6';
-        $release = '05a671c66aefea124cc08b76ea6d30bb';
-        $eventId = '31423';
-        $record = $this->getRecord(Logger::INFO, 'test', array('checksum' => $checksum, 'release' => $release, 'event_id' => $eventId));
-        $handler->handle($record);
-
-        $this->assertEquals($checksum, $ravenClient->lastData['checksum']);
-        $this->assertEquals($release, $ravenClient->lastData['release']);
-        $this->assertEquals($eventId, $ravenClient->lastData['event_id']);
-    }
-
-    public function testFingerprint()
-    {
-        $ravenClient = $this->getRavenClient();
-        $handler = $this->getHandler($ravenClient);
-
-        $fingerprint = array('{{ default }}', 'other value');
-        $record = $this->getRecord(Logger::INFO, 'test', array('fingerprint' => $fingerprint));
-        $handler->handle($record);
-
-        $this->assertEquals($fingerprint, $ravenClient->lastData['fingerprint']);
-    }
-
-    public function testUserContext()
-    {
-        $ravenClient = $this->getRavenClient();
-        $handler = $this->getHandler($ravenClient);
-
-        $recordWithNoContext = $this->getRecord(Logger::INFO, 'test with default user context');
-        // set user context 'externally'
-
-        $user = array(
-            'id' => '123',
-            'email' => 'test@test.com',
-        );
-
-        $recordWithContext = $this->getRecord(Logger::INFO, 'test', array('user' => $user));
-
-        $ravenClient->user_context(array('id' => 'test_user_id'));
-        // handle context
-        $handler->handle($recordWithContext);
-        $this->assertEquals($user, $ravenClient->lastData['user']);
-
-        // check to see if its reset
-        $handler->handle($recordWithNoContext);
-        $this->assertInternalType('array', $ravenClient->context->user);
-        $this->assertSame('test_user_id', $ravenClient->context->user['id']);
-
-        // handle with null context
-        $ravenClient->user_context(null);
-        $handler->handle($recordWithContext);
-        $this->assertEquals($user, $ravenClient->lastData['user']);
-
-        // check to see if its reset
-        $handler->handle($recordWithNoContext);
-        $this->assertNull($ravenClient->context->user);
-    }
-
-    public function testException()
-    {
-        $ravenClient = $this->getRavenClient();
-        $handler = $this->getHandler($ravenClient);
-
-        try {
-            $this->methodThatThrowsAnException();
-        } catch (\Exception $e) {
-            $record = $this->getRecord(Logger::ERROR, $e->getMessage(), array('exception' => $e));
-            $handler->handle($record);
-        }
-
-        $this->assertEquals($record['message'], $ravenClient->lastData['message']);
-    }
-
-    public function testHandleBatch()
-    {
-        $records = $this->getMultipleRecords();
-        $records[] = $this->getRecord(Logger::WARNING, 'warning');
-        $records[] = $this->getRecord(Logger::WARNING, 'warning');
-
-        $logFormatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');
-        $logFormatter->expects($this->once())->method('formatBatch');
-
-        $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');
-        $formatter->expects($this->once())->method('format')->with($this->callback(function ($record) {
-            return $record['level'] == 400;
-        }));
-
-        $handler = $this->getHandler($this->getRavenClient());
-        $handler->setBatchFormatter($logFormatter);
-        $handler->setFormatter($formatter);
-        $handler->handleBatch($records);
-    }
-
-    public function testHandleBatchDoNothingIfRecordsAreBelowLevel()
-    {
-        $records = array(
-            $this->getRecord(Logger::DEBUG, 'debug message 1'),
-            $this->getRecord(Logger::DEBUG, 'debug message 2'),
-            $this->getRecord(Logger::INFO, 'information'),
-        );
-
-        $handler = $this->getMock('Monolog\Handler\RavenHandler', null, array($this->getRavenClient()));
-        $handler->expects($this->never())->method('handle');
-        $handler->setLevel(Logger::ERROR);
-        $handler->handleBatch($records);
-    }
-
-    public function testHandleBatchPicksProperMessage()
-    {
-        $records = array(
-            $this->getRecord(Logger::DEBUG, 'debug message 1'),
-            $this->getRecord(Logger::DEBUG, 'debug message 2'),
-            $this->getRecord(Logger::INFO, 'information 1'),
-            $this->getRecord(Logger::ERROR, 'error 1'),
-            $this->getRecord(Logger::WARNING, 'warning'),
-            $this->getRecord(Logger::ERROR, 'error 2'),
-            $this->getRecord(Logger::INFO, 'information 2'),
-        );
-
-        $logFormatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');
-        $logFormatter->expects($this->once())->method('formatBatch');
-
-        $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');
-        $formatter->expects($this->once())->method('format')->with($this->callback(function ($record) use ($records) {
-            return $record['message'] == 'error 1';
-        }));
-
-        $handler = $this->getHandler($this->getRavenClient());
-        $handler->setBatchFormatter($logFormatter);
-        $handler->setFormatter($formatter);
-        $handler->handleBatch($records);
-    }
-
-    public function testGetSetBatchFormatter()
-    {
-        $ravenClient = $this->getRavenClient();
-        $handler = $this->getHandler($ravenClient);
-
-        $handler->setBatchFormatter($formatter = new LineFormatter());
-        $this->assertSame($formatter, $handler->getBatchFormatter());
-    }
-
-    public function testRelease()
-    {
-        $ravenClient = $this->getRavenClient();
-        $handler = $this->getHandler($ravenClient);
-        $release = 'v42.42.42';
-        $handler->setRelease($release);
-        $record = $this->getRecord(Logger::INFO, 'test');
-        $handler->handle($record);
-        $this->assertEquals($release, $ravenClient->lastData['release']);
-
-        $localRelease = 'v41.41.41';
-        $record = $this->getRecord(Logger::INFO, 'test', array('release' => $localRelease));
-        $handler->handle($record);
-        $this->assertEquals($localRelease, $ravenClient->lastData['release']);
-    }
-
-    private function methodThatThrowsAnException()
-    {
-        throw new \Exception('This is an exception');
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php
deleted file mode 100644
index 689d527..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php
+++ /dev/null
@@ -1,127 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-use Monolog\Formatter\LineFormatter;
-
-class RedisHandlerTest extends TestCase
-{
-    /**
-     * @expectedException InvalidArgumentException
-     */
-    public function testConstructorShouldThrowExceptionForInvalidRedis()
-    {
-        new RedisHandler(new \stdClass(), 'key');
-    }
-
-    public function testConstructorShouldWorkWithPredis()
-    {
-        $redis = $this->getMock('Predis\Client');
-        $this->assertInstanceof('Monolog\Handler\RedisHandler', new RedisHandler($redis, 'key'));
-    }
-
-    public function testConstructorShouldWorkWithRedis()
-    {
-        $redis = $this->getMock('Redis');
-        $this->assertInstanceof('Monolog\Handler\RedisHandler', new RedisHandler($redis, 'key'));
-    }
-
-    public function testPredisHandle()
-    {
-        $redis = $this->getMock('Predis\Client', array('rpush'));
-
-        // Predis\Client uses rpush
-        $redis->expects($this->once())
-            ->method('rpush')
-            ->with('key', 'test');
-
-        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34));
-
-        $handler = new RedisHandler($redis, 'key');
-        $handler->setFormatter(new LineFormatter("%message%"));
-        $handler->handle($record);
-    }
-
-    public function testRedisHandle()
-    {
-        $redis = $this->getMock('Redis', array('rpush'));
-
-        // Redis uses rPush
-        $redis->expects($this->once())
-            ->method('rPush')
-            ->with('key', 'test');
-
-        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34));
-
-        $handler = new RedisHandler($redis, 'key');
-        $handler->setFormatter(new LineFormatter("%message%"));
-        $handler->handle($record);
-    }
-
-    public function testRedisHandleCapped()
-    {
-        $redis = $this->getMock('Redis', array('multi', 'rpush', 'ltrim', 'exec'));
-
-        // Redis uses multi
-        $redis->expects($this->once())
-            ->method('multi')
-            ->will($this->returnSelf());
-
-        $redis->expects($this->once())
-            ->method('rpush')
-            ->will($this->returnSelf());
-
-        $redis->expects($this->once())
-            ->method('ltrim')
-            ->will($this->returnSelf());
-
-        $redis->expects($this->once())
-            ->method('exec')
-            ->will($this->returnSelf());
-
-        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34));
-
-        $handler = new RedisHandler($redis, 'key', Logger::DEBUG, true, 10);
-        $handler->setFormatter(new LineFormatter("%message%"));
-        $handler->handle($record);
-    }
-
-    public function testPredisHandleCapped()
-    {
-        $redis = $this->getMock('Predis\Client', array('transaction'));
-
-        $redisTransaction = $this->getMock('Predis\Client', array('rpush', 'ltrim'));
-
-        $redisTransaction->expects($this->once())
-            ->method('rpush')
-            ->will($this->returnSelf());
-
-        $redisTransaction->expects($this->once())
-            ->method('ltrim')
-            ->will($this->returnSelf());
-
-        // Redis uses multi
-        $redis->expects($this->once())
-            ->method('transaction')
-            ->will($this->returnCallback(function ($cb) use ($redisTransaction) {
-                $cb($redisTransaction);
-            }));
-
-        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34));
-
-        $handler = new RedisHandler($redis, 'key', Logger::DEBUG, true, 10);
-        $handler->setFormatter(new LineFormatter("%message%"));
-        $handler->handle($record);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/RollbarHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/RollbarHandlerTest.php
deleted file mode 100644
index f302e91..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/RollbarHandlerTest.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Exception;
-use Monolog\TestCase;
-use Monolog\Logger;
-use PHPUnit_Framework_MockObject_MockObject as MockObject;
-
-/**
- * @author Erik Johansson <erik.pm.johansson@gmail.com>
- * @see    https://rollbar.com/docs/notifier/rollbar-php/
- *
- * @coversDefaultClass Monolog\Handler\RollbarHandler
- */
-class RollbarHandlerTest extends TestCase
-{
-    /**
-     * @var MockObject
-     */
-    private $rollbarNotifier;
-
-    /**
-     * @var array
-     */
-    public $reportedExceptionArguments = null;
-
-    protected function setUp()
-    {
-        parent::setUp();
-
-        $this->setupRollbarNotifierMock();
-    }
-
-    /**
-     * When reporting exceptions to Rollbar the
-     * level has to be set in the payload data
-     */
-    public function testExceptionLogLevel()
-    {
-        $handler = $this->createHandler();
-
-        $handler->handle($this->createExceptionRecord(Logger::DEBUG));
-
-        $this->assertEquals('debug', $this->reportedExceptionArguments['payload']['level']);
-    }
-
-    private function setupRollbarNotifierMock()
-    {
-        $this->rollbarNotifier = $this->getMockBuilder('RollbarNotifier')
-            ->setMethods(array('report_message', 'report_exception', 'flush'))
-            ->getMock();
-
-        $that = $this;
-
-        $this->rollbarNotifier
-            ->expects($this->any())
-            ->method('report_exception')
-            ->willReturnCallback(function ($exception, $context, $payload) use ($that) {
-                $that->reportedExceptionArguments = compact('exception', 'context', 'payload');
-            });
-    }
-
-    private function createHandler()
-    {
-        return new RollbarHandler($this->rollbarNotifier, Logger::DEBUG);
-    }
-
-    private function createExceptionRecord($level = Logger::DEBUG, $message = 'test', $exception = null)
-    {
-        return $this->getRecord($level, $message, array(
-            'exception' => $exception ?: new Exception()
-        ));
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php
deleted file mode 100644
index c6f5fac..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php
+++ /dev/null
@@ -1,245 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use PHPUnit_Framework_Error_Deprecated;
-
-/**
- * @covers Monolog\Handler\RotatingFileHandler
- */
-class RotatingFileHandlerTest extends TestCase
-{
-    /**
-     * This var should be private but then the anonymous function
-     * in the `setUp` method won't be able to set it. `$this` cant't
-     * be used in the anonymous function in `setUp` because PHP 5.3
-     * does not support it.
-     */
-    public $lastError;
-
-    public function setUp()
-    {
-        $dir = __DIR__.'/Fixtures';
-        chmod($dir, 0777);
-        if (!is_writable($dir)) {
-            $this->markTestSkipped($dir.' must be writable to test the RotatingFileHandler.');
-        }
-        $this->lastError = null;
-        $self = $this;
-        // workaround with &$self used for PHP 5.3
-        set_error_handler(function($code, $message) use (&$self) {
-            $self->lastError = array(
-                'code' => $code,
-                'message' => $message,
-            );
-        });
-    }
-
-    private function assertErrorWasTriggered($code, $message)
-    {
-        if (empty($this->lastError)) {
-            $this->fail(
-                sprintf(
-                    'Failed asserting that error with code `%d` and message `%s` was triggered',
-                    $code,
-                    $message
-                )
-            );
-        }
-        $this->assertEquals($code, $this->lastError['code'], sprintf('Expected an error with code %d to be triggered, got `%s` instead', $code, $this->lastError['code']));
-        $this->assertEquals($message, $this->lastError['message'], sprintf('Expected an error with message `%d` to be triggered, got `%s` instead', $message, $this->lastError['message']));
-    }
-
-    public function testRotationCreatesNewFile()
-    {
-        touch(__DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400).'.rot');
-
-        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot');
-        $handler->setFormatter($this->getIdentityFormatter());
-        $handler->handle($this->getRecord());
-
-        $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot';
-        $this->assertTrue(file_exists($log));
-        $this->assertEquals('test', file_get_contents($log));
-    }
-
-    /**
-     * @dataProvider rotationTests
-     */
-    public function testRotation($createFile, $dateFormat, $timeCallback)
-    {
-        touch($old1 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-1)).'.rot');
-        touch($old2 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-2)).'.rot');
-        touch($old3 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-3)).'.rot');
-        touch($old4 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-4)).'.rot');
-
-        $log = __DIR__.'/Fixtures/foo-'.date($dateFormat).'.rot';
-
-        if ($createFile) {
-            touch($log);
-        }
-
-        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2);
-        $handler->setFormatter($this->getIdentityFormatter());
-        $handler->setFilenameFormat('{filename}-{date}', $dateFormat);
-        $handler->handle($this->getRecord());
-
-        $handler->close();
-
-        $this->assertTrue(file_exists($log));
-        $this->assertTrue(file_exists($old1));
-        $this->assertEquals($createFile, file_exists($old2));
-        $this->assertEquals($createFile, file_exists($old3));
-        $this->assertEquals($createFile, file_exists($old4));
-        $this->assertEquals('test', file_get_contents($log));
-    }
-
-    public function rotationTests()
-    {
-        $now = time();
-        $dayCallback = function($ago) use ($now) {
-            return $now + 86400 * $ago;
-        };
-        $monthCallback = function($ago) {
-            return gmmktime(0, 0, 0, date('n') + $ago, 1, date('Y'));
-        };
-        $yearCallback = function($ago) {
-            return gmmktime(0, 0, 0, 1, 1, date('Y') + $ago);
-        };
-
-        return array(
-            'Rotation is triggered when the file of the current day is not present'
-                => array(true, RotatingFileHandler::FILE_PER_DAY, $dayCallback),
-            'Rotation is not triggered when the file of the current day is already present'
-                => array(false, RotatingFileHandler::FILE_PER_DAY, $dayCallback),
-
-            'Rotation is triggered when the file of the current month is not present'
-                => array(true, RotatingFileHandler::FILE_PER_MONTH, $monthCallback),
-            'Rotation is not triggered when the file of the current month is already present'
-                => array(false, RotatingFileHandler::FILE_PER_MONTH, $monthCallback),
-
-            'Rotation is triggered when the file of the current year is not present'
-                => array(true, RotatingFileHandler::FILE_PER_YEAR, $yearCallback),
-            'Rotation is not triggered when the file of the current year is already present'
-                => array(false, RotatingFileHandler::FILE_PER_YEAR, $yearCallback),
-        );
-    }
-
-    /**
-     * @dataProvider dateFormatProvider
-     */
-    public function testAllowOnlyFixedDefinedDateFormats($dateFormat, $valid)
-    {
-        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2);
-        $handler->setFilenameFormat('{filename}-{date}', $dateFormat);
-        if (!$valid) {
-            $this->assertErrorWasTriggered(
-                E_USER_DEPRECATED,
-                'Invalid date format - format must be one of RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), '.
-                'RotatingFileHandler::FILE_PER_MONTH ("Y-m") or RotatingFileHandler::FILE_PER_YEAR ("Y"), '.
-                'or you can set one of the date formats using slashes, underscores and/or dots instead of dashes.'
-            );
-        }
-    }
-
-    public function dateFormatProvider()
-    {
-        return array(
-            array(RotatingFileHandler::FILE_PER_DAY, true),
-            array(RotatingFileHandler::FILE_PER_MONTH, true),
-            array(RotatingFileHandler::FILE_PER_YEAR, true),
-            array('m-d-Y', false),
-            array('Y-m-d-h-i', false)
-        );
-    }
-
-    /**
-     * @dataProvider filenameFormatProvider
-     */
-    public function testDisallowFilenameFormatsWithoutDate($filenameFormat, $valid)
-    {
-        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2);
-        $handler->setFilenameFormat($filenameFormat, RotatingFileHandler::FILE_PER_DAY);
-        if (!$valid) {
-            $this->assertErrorWasTriggered(
-                E_USER_DEPRECATED,
-                'Invalid filename format - format should contain at least `{date}`, because otherwise rotating is impossible.'
-            );
-        }
-    }
-
-    public function filenameFormatProvider()
-    {
-        return array(
-            array('{filename}', false),
-            array('{filename}-{date}', true),
-            array('{date}', true),
-            array('foobar-{date}', true),
-            array('foo-{date}-bar', true),
-            array('{date}-foobar', true),
-            array('foobar', false),
-        );
-    }
-
-    /**
-     * @dataProvider rotationWhenSimilarFilesExistTests
-     */
-    public function testRotationWhenSimilarFileNamesExist($dateFormat)
-    {
-        touch($old1 = __DIR__.'/Fixtures/foo-foo-'.date($dateFormat).'.rot');
-        touch($old2 = __DIR__.'/Fixtures/foo-bar-'.date($dateFormat).'.rot');
-
-        $log = __DIR__.'/Fixtures/foo-'.date($dateFormat).'.rot';
-
-        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2);
-        $handler->setFormatter($this->getIdentityFormatter());
-        $handler->setFilenameFormat('{filename}-{date}', $dateFormat);
-        $handler->handle($this->getRecord());
-        $handler->close();
-
-        $this->assertTrue(file_exists($log));
-    }
-
-    public function rotationWhenSimilarFilesExistTests()
-    {
-
-        return array(
-            'Rotation is triggered when the file of the current day is not present but similar exists'
-                => array(RotatingFileHandler::FILE_PER_DAY),
-
-            'Rotation is triggered when the file of the current month is not present but similar exists'
-                => array(RotatingFileHandler::FILE_PER_MONTH),
-
-            'Rotation is triggered when the file of the current year is not present but similar exists'
-                => array(RotatingFileHandler::FILE_PER_YEAR),
-        );
-    }
-
-    public function testReuseCurrentFile()
-    {
-        $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot';
-        file_put_contents($log, "foo");
-        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot');
-        $handler->setFormatter($this->getIdentityFormatter());
-        $handler->handle($this->getRecord());
-        $this->assertEquals('footest', file_get_contents($log));
-    }
-
-    public function tearDown()
-    {
-        foreach (glob(__DIR__.'/Fixtures/*.rot') as $file) {
-            unlink($file);
-        }
-        restore_error_handler();
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SamplingHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SamplingHandlerTest.php
deleted file mode 100644
index b354cee..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/SamplingHandlerTest.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-
-/**
- * @covers Monolog\Handler\SamplingHandler::handle
- */
-class SamplingHandlerTest extends TestCase
-{
-    public function testHandle()
-    {
-        $testHandler = new TestHandler();
-        $handler = new SamplingHandler($testHandler, 2);
-        for ($i = 0; $i < 10000; $i++) {
-            $handler->handle($this->getRecord());
-        }
-        $count = count($testHandler->getRecords());
-        // $count should be half of 10k, so between 4k and 6k
-        $this->assertLessThan(6000, $count);
-        $this->assertGreaterThan(4000, $count);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php
deleted file mode 100644
index b9de736..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php
+++ /dev/null
@@ -1,395 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler\Slack;
-
-use Monolog\Logger;
-use Monolog\TestCase;
-
-/**
- * @coversDefaultClass Monolog\Handler\Slack\SlackRecord
- */
-class SlackRecordTest extends TestCase
-{
-    private $jsonPrettyPrintFlag;
-
-    protected function setUp()
-    {
-        $this->jsonPrettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128;
-    }
-
-    public function dataGetAttachmentColor()
-    {
-        return array(
-            array(Logger::DEBUG, SlackRecord::COLOR_DEFAULT),
-            array(Logger::INFO, SlackRecord::COLOR_GOOD),
-            array(Logger::NOTICE, SlackRecord::COLOR_GOOD),
-            array(Logger::WARNING, SlackRecord::COLOR_WARNING),
-            array(Logger::ERROR, SlackRecord::COLOR_DANGER),
-            array(Logger::CRITICAL, SlackRecord::COLOR_DANGER),
-            array(Logger::ALERT, SlackRecord::COLOR_DANGER),
-            array(Logger::EMERGENCY, SlackRecord::COLOR_DANGER),
-        );
-    }
-
-    /**
-     * @dataProvider dataGetAttachmentColor
-     * @param  int $logLevel
-     * @param  string $expectedColour RGB hex color or name of Slack color
-     * @covers ::getAttachmentColor
-     */
-    public function testGetAttachmentColor($logLevel, $expectedColour)
-    {
-        $slackRecord = new SlackRecord();
-        $this->assertSame(
-            $expectedColour,
-            $slackRecord->getAttachmentColor($logLevel)
-        );
-    }
-
-    public function testAddsChannel()
-    {
-        $channel = '#test';
-        $record = new SlackRecord($channel);
-        $data = $record->getSlackData($this->getRecord());
-
-        $this->assertArrayHasKey('channel', $data);
-        $this->assertSame($channel, $data['channel']);
-    }
-
-    public function testNoUsernameByDefault()
-    {
-        $record = new SlackRecord();
-        $data = $record->getSlackData($this->getRecord());
-
-        $this->assertArrayNotHasKey('username', $data);
-    }
-
-    /**
-     * @return array
-     */
-    public function dataStringify()
-    {
-        $jsonPrettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128;
-
-        $multipleDimensions = array(array(1, 2));
-        $numericKeys = array('library' => 'monolog');
-        $singleDimension = array(1, 'Hello', 'Jordi');
-
-        return array(
-            array(array(), '[]'),
-            array($multipleDimensions, json_encode($multipleDimensions, $jsonPrettyPrintFlag)),
-            array($numericKeys, json_encode($numericKeys, $jsonPrettyPrintFlag)),
-            array($singleDimension, json_encode($singleDimension))
-        );
-    }
-
-    /**
-     * @dataProvider dataStringify
-     */
-    public function testStringify($fields, $expectedResult)
-    {
-        $slackRecord = new SlackRecord(
-            '#test',
-            'test',
-            true,
-            null,
-            true,
-            true
-        );
-
-        $this->assertSame($expectedResult, $slackRecord->stringify($fields));
-    }
-
-    public function testAddsCustomUsername()
-    {
-        $username = 'Monolog bot';
-        $record = new SlackRecord(null, $username);
-        $data = $record->getSlackData($this->getRecord());
-
-        $this->assertArrayHasKey('username', $data);
-        $this->assertSame($username, $data['username']);
-    }
-
-    public function testNoIcon()
-    {
-        $record = new SlackRecord();
-        $data = $record->getSlackData($this->getRecord());
-
-        $this->assertArrayNotHasKey('icon_emoji', $data);
-    }
-
-    public function testAddsIcon()
-    {
-        $record = $this->getRecord();
-        $slackRecord = new SlackRecord(null, null, false, 'ghost');
-        $data = $slackRecord->getSlackData($record);
-
-        $slackRecord2 = new SlackRecord(null, null, false, 'http://github.com/Seldaek/monolog');
-        $data2 = $slackRecord2->getSlackData($record);
-
-        $this->assertArrayHasKey('icon_emoji', $data);
-        $this->assertSame(':ghost:', $data['icon_emoji']);
-        $this->assertArrayHasKey('icon_url', $data2);
-        $this->assertSame('http://github.com/Seldaek/monolog', $data2['icon_url']);
-    }
-
-    public function testAttachmentsNotPresentIfNoAttachment()
-    {
-        $record = new SlackRecord(null, null, false);
-        $data = $record->getSlackData($this->getRecord());
-
-        $this->assertArrayNotHasKey('attachments', $data);
-    }
-
-    public function testAddsOneAttachment()
-    {
-        $record = new SlackRecord();
-        $data = $record->getSlackData($this->getRecord());
-
-        $this->assertArrayHasKey('attachments', $data);
-        $this->assertArrayHasKey(0, $data['attachments']);
-        $this->assertInternalType('array', $data['attachments'][0]);
-    }
-
-    public function testTextEqualsMessageIfNoAttachment()
-    {
-        $message = 'Test message';
-        $record = new SlackRecord(null, null, false);
-        $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message));
-
-        $this->assertArrayHasKey('text', $data);
-        $this->assertSame($message, $data['text']);
-    }
-
-    public function testTextEqualsFormatterOutput()
-    {
-        $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');
-        $formatter
-            ->expects($this->any())
-            ->method('format')
-            ->will($this->returnCallback(function ($record) { return $record['message'] . 'test'; }));
-
-        $formatter2 = $this->getMock('Monolog\\Formatter\\FormatterInterface');
-        $formatter2
-            ->expects($this->any())
-            ->method('format')
-            ->will($this->returnCallback(function ($record) { return $record['message'] . 'test1'; }));
-
-        $message = 'Test message';
-        $record = new SlackRecord(null, null, false, null, false, false, array(), $formatter);
-        $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message));
-
-        $this->assertArrayHasKey('text', $data);
-        $this->assertSame($message . 'test', $data['text']);
-
-        $record->setFormatter($formatter2);
-        $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message));
-
-        $this->assertArrayHasKey('text', $data);
-        $this->assertSame($message . 'test1', $data['text']);
-    }
-
-    public function testAddsFallbackAndTextToAttachment()
-    {
-        $message = 'Test message';
-        $record = new SlackRecord(null);
-        $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message));
-
-        $this->assertSame($message, $data['attachments'][0]['text']);
-        $this->assertSame($message, $data['attachments'][0]['fallback']);
-    }
-
-    public function testMapsLevelToColorAttachmentColor()
-    {
-        $record = new SlackRecord(null);
-        $errorLoggerRecord = $this->getRecord(Logger::ERROR);
-        $emergencyLoggerRecord = $this->getRecord(Logger::EMERGENCY);
-        $warningLoggerRecord = $this->getRecord(Logger::WARNING);
-        $infoLoggerRecord = $this->getRecord(Logger::INFO);
-        $debugLoggerRecord = $this->getRecord(Logger::DEBUG);
-
-        $data = $record->getSlackData($errorLoggerRecord);
-        $this->assertSame(SlackRecord::COLOR_DANGER, $data['attachments'][0]['color']);
-
-        $data = $record->getSlackData($emergencyLoggerRecord);
-        $this->assertSame(SlackRecord::COLOR_DANGER, $data['attachments'][0]['color']);
-
-        $data = $record->getSlackData($warningLoggerRecord);
-        $this->assertSame(SlackRecord::COLOR_WARNING, $data['attachments'][0]['color']);
-
-        $data = $record->getSlackData($infoLoggerRecord);
-        $this->assertSame(SlackRecord::COLOR_GOOD, $data['attachments'][0]['color']);
-
-        $data = $record->getSlackData($debugLoggerRecord);
-        $this->assertSame(SlackRecord::COLOR_DEFAULT, $data['attachments'][0]['color']);
-    }
-
-    public function testAddsShortAttachmentWithoutContextAndExtra()
-    {
-        $level = Logger::ERROR;
-        $levelName = Logger::getLevelName($level);
-        $record = new SlackRecord(null, null, true, null, true);
-        $data = $record->getSlackData($this->getRecord($level, 'test', array('test' => 1)));
-
-        $attachment = $data['attachments'][0];
-        $this->assertArrayHasKey('title', $attachment);
-        $this->assertArrayHasKey('fields', $attachment);
-        $this->assertSame($levelName, $attachment['title']);
-        $this->assertSame(array(), $attachment['fields']);
-    }
-
-    public function testAddsShortAttachmentWithContextAndExtra()
-    {
-        $level = Logger::ERROR;
-        $levelName = Logger::getLevelName($level);
-        $context = array('test' => 1);
-        $extra = array('tags' => array('web'));
-        $record = new SlackRecord(null, null, true, null, true, true);
-        $loggerRecord = $this->getRecord($level, 'test', $context);
-        $loggerRecord['extra'] = $extra;
-        $data = $record->getSlackData($loggerRecord);
-
-        $attachment = $data['attachments'][0];
-        $this->assertArrayHasKey('title', $attachment);
-        $this->assertArrayHasKey('fields', $attachment);
-        $this->assertCount(2, $attachment['fields']);
-        $this->assertSame($levelName, $attachment['title']);
-        $this->assertSame(
-            array(
-                array(
-                    'title' => 'Extra',
-                    'value' => sprintf('```%s```', json_encode($extra, $this->jsonPrettyPrintFlag)),
-                    'short' => false
-                ),
-                array(
-                    'title' => 'Context',
-                    'value' => sprintf('```%s```', json_encode($context, $this->jsonPrettyPrintFlag)),
-                    'short' => false
-                )
-            ),
-            $attachment['fields']
-        );
-    }
-
-    public function testAddsLongAttachmentWithoutContextAndExtra()
-    {
-        $level = Logger::ERROR;
-        $levelName = Logger::getLevelName($level);
-        $record = new SlackRecord(null, null, true, null);
-        $data = $record->getSlackData($this->getRecord($level, 'test', array('test' => 1)));
-
-        $attachment = $data['attachments'][0];
-        $this->assertArrayHasKey('title', $attachment);
-        $this->assertArrayHasKey('fields', $attachment);
-        $this->assertCount(1, $attachment['fields']);
-        $this->assertSame('Message', $attachment['title']);
-        $this->assertSame(
-            array(array(
-                'title' => 'Level',
-                'value' => $levelName,
-                'short' => false
-            )),
-            $attachment['fields']
-        );
-    }
-
-    public function testAddsLongAttachmentWithContextAndExtra()
-    {
-        $level = Logger::ERROR;
-        $levelName = Logger::getLevelName($level);
-        $context = array('test' => 1);
-        $extra = array('tags' => array('web'));
-        $record = new SlackRecord(null, null, true, null, false, true);
-        $loggerRecord = $this->getRecord($level, 'test', $context);
-        $loggerRecord['extra'] = $extra;
-        $data = $record->getSlackData($loggerRecord);
-
-        $expectedFields = array(
-            array(
-                'title' => 'Level',
-                'value' => $levelName,
-                'short' => false,
-            ),
-            array(
-                'title' => 'Tags',
-                'value' => sprintf('```%s```', json_encode($extra['tags'])),
-                'short' => false
-            ),
-            array(
-                'title' => 'Test',
-                'value' => $context['test'],
-                'short' => false
-            )
-        );
-
-        $attachment = $data['attachments'][0];
-        $this->assertArrayHasKey('title', $attachment);
-        $this->assertArrayHasKey('fields', $attachment);
-        $this->assertCount(3, $attachment['fields']);
-        $this->assertSame('Message', $attachment['title']);
-        $this->assertSame(
-            $expectedFields,
-            $attachment['fields']
-        );
-    }
-
-    public function testAddsTimestampToAttachment()
-    {
-        $record = $this->getRecord();
-        $slackRecord = new SlackRecord();
-        $data = $slackRecord->getSlackData($this->getRecord());
-
-        $attachment = $data['attachments'][0];
-        $this->assertArrayHasKey('ts', $attachment);
-        $this->assertSame($record['datetime']->getTimestamp(), $attachment['ts']);
-    }
-
-    public function testContextHasException()
-    {
-        $record = $this->getRecord(Logger::CRITICAL, 'This is a critical message.', array('exception' => new \Exception()));
-        $slackRecord = new SlackRecord(null, null, true, null, false, true);
-        $data = $slackRecord->getSlackData($record);
-        $this->assertInternalType('string', $data['attachments'][0]['fields'][1]['value']);
-    }
-
-    public function testExcludeExtraAndContextFields()
-    {
-        $record = $this->getRecord(
-            Logger::WARNING,
-            'test',
-            array('info' => array('library' => 'monolog', 'author' => 'Jordi'))
-        );
-        $record['extra'] = array('tags' => array('web', 'cli'));
-
-        $slackRecord = new SlackRecord(null, null, true, null, false, true, array('context.info.library', 'extra.tags.1'));
-        $data = $slackRecord->getSlackData($record);
-        $attachment = $data['attachments'][0];
-
-        $expected = array(
-            array(
-                'title' => 'Info',
-                'value' => sprintf('```%s```', json_encode(array('author' => 'Jordi'), $this->jsonPrettyPrintFlag)),
-                'short' => false
-            ),
-            array(
-                'title' => 'Tags',
-                'value' => sprintf('```%s```', json_encode(array('web'))),
-                'short' => false
-            ),
-        );
-
-        foreach ($expected as $field) {
-            $this->assertNotFalse(array_search($field, $attachment['fields']));
-            break;
-        }
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SlackHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SlackHandlerTest.php
deleted file mode 100644
index b12b01f..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/SlackHandlerTest.php
+++ /dev/null
@@ -1,155 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-use Monolog\Formatter\LineFormatter;
-use Monolog\Handler\Slack\SlackRecord;
-
-/**
- * @author Greg Kedzierski <greg@gregkedzierski.com>
- * @see    https://api.slack.com/
- */
-class SlackHandlerTest extends TestCase
-{
-    /**
-     * @var resource
-     */
-    private $res;
-
-    /**
-     * @var SlackHandler
-     */
-    private $handler;
-
-    public function setUp()
-    {
-        if (!extension_loaded('openssl')) {
-            $this->markTestSkipped('This test requires openssl to run');
-        }
-    }
-
-    public function testWriteHeader()
-    {
-        $this->createHandler();
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/POST \/api\/chat.postMessage HTTP\/1.1\\r\\nHost: slack.com\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content);
-    }
-
-    public function testWriteContent()
-    {
-        $this->createHandler();
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegExp('/username=Monolog/', $content);
-        $this->assertRegExp('/channel=channel1/', $content);
-        $this->assertRegExp('/token=myToken/', $content);
-        $this->assertRegExp('/attachments/', $content);
-    }
-
-    public function testWriteContentUsesFormatterIfProvided()
-    {
-        $this->createHandler('myToken', 'channel1', 'Monolog', false);
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->createHandler('myToken', 'channel1', 'Monolog', false);
-        $this->handler->setFormatter(new LineFormatter('foo--%message%'));
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test2'));
-        fseek($this->res, 0);
-        $content2 = fread($this->res, 1024);
-
-        $this->assertRegexp('/text=test1/', $content);
-        $this->assertRegexp('/text=foo--test2/', $content2);
-    }
-
-    public function testWriteContentWithEmoji()
-    {
-        $this->createHandler('myToken', 'channel1', 'Monolog', true, 'alien');
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/icon_emoji=%3Aalien%3A/', $content);
-    }
-
-    /**
-     * @dataProvider provideLevelColors
-     */
-    public function testWriteContentWithColors($level, $expectedColor)
-    {
-        $this->createHandler();
-        $this->handler->handle($this->getRecord($level, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/%22color%22%3A%22'.$expectedColor.'/', $content);
-    }
-
-    public function testWriteContentWithPlainTextMessage()
-    {
-        $this->createHandler('myToken', 'channel1', 'Monolog', false);
-        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
-        fseek($this->res, 0);
-        $content = fread($this->res, 1024);
-
-        $this->assertRegexp('/text=test1/', $content);
-    }
-
-    public function provideLevelColors()
-    {
-        return array(
-            array(Logger::DEBUG,    urlencode(SlackRecord::COLOR_DEFAULT)),
-            array(Logger::INFO,     SlackRecord::COLOR_GOOD),
-            array(Logger::NOTICE,   SlackRecord::COLOR_GOOD),
-            array(Logger::WARNING,  SlackRecord::COLOR_WARNING),
-            array(Logger::ERROR,    SlackRecord::COLOR_DANGER),
-            array(Logger::CRITICAL, SlackRecord::COLOR_DANGER),
-            array(Logger::ALERT,    SlackRecord::COLOR_DANGER),
-            array(Logger::EMERGENCY,SlackRecord::COLOR_DANGER),
-        );
-    }
-
-    private function createHandler($token = 'myToken', $channel = 'channel1', $username = 'Monolog', $useAttachment = true, $iconEmoji = null, $useShortAttachment = false, $includeExtra = false)
-    {
-        $constructorArgs = array($token, $channel, $username, $useAttachment, $iconEmoji, Logger::DEBUG, true, $useShortAttachment, $includeExtra);
-        $this->res = fopen('php://memory', 'a');
-        $this->handler = $this->getMock(
-            '\Monolog\Handler\SlackHandler',
-            array('fsockopen', 'streamSetTimeout', 'closeSocket'),
-            $constructorArgs
-        );
-
-        $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($this->handler, 'localhost:1234');
-
-        $this->handler->expects($this->any())
-            ->method('fsockopen')
-            ->will($this->returnValue($this->res));
-        $this->handler->expects($this->any())
-            ->method('streamSetTimeout')
-            ->will($this->returnValue(true));
-        $this->handler->expects($this->any())
-            ->method('closeSocket')
-            ->will($this->returnValue(true));
-
-        $this->handler->setFormatter($this->getIdentityFormatter());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SlackWebhookHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SlackWebhookHandlerTest.php
deleted file mode 100644
index c9229e2..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/SlackWebhookHandlerTest.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-use Monolog\Formatter\LineFormatter;
-use Monolog\Handler\Slack\SlackRecord;
-
-/**
- * @author Haralan Dobrev <hkdobrev@gmail.com>
- * @see    https://api.slack.com/incoming-webhooks
- * @coversDefaultClass Monolog\Handler\SlackWebhookHandler
- */
-class SlackWebhookHandlerTest extends TestCase
-{
-    const WEBHOOK_URL = 'https://hooks.slack.com/services/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E';
-
-    /**
-     * @covers ::__construct
-     * @covers ::getSlackRecord
-     */
-    public function testConstructorMinimal()
-    {
-        $handler = new SlackWebhookHandler(self::WEBHOOK_URL);
-        $record = $this->getRecord();
-        $slackRecord = $handler->getSlackRecord();
-        $this->assertInstanceOf('Monolog\Handler\Slack\SlackRecord', $slackRecord);
-        $this->assertEquals(array(
-            'attachments' => array(
-                array(
-                    'fallback' => 'test',
-                    'text' => 'test',
-                    'color' => SlackRecord::COLOR_WARNING,
-                    'fields' => array(
-                        array(
-                            'title' => 'Level',
-                            'value' => 'WARNING',
-                            'short' => false,
-                        ),
-                    ),
-                    'title' => 'Message',
-                    'mrkdwn_in' => array('fields'),
-                    'ts' => $record['datetime']->getTimestamp(),
-                ),
-            ),
-        ), $slackRecord->getSlackData($record));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getSlackRecord
-     */
-    public function testConstructorFull()
-    {
-        $handler = new SlackWebhookHandler(
-            self::WEBHOOK_URL,
-            'test-channel',
-            'test-username',
-            false,
-            ':ghost:',
-            false,
-            false,
-            Logger::DEBUG,
-            false
-        );
-
-        $slackRecord = $handler->getSlackRecord();
-        $this->assertInstanceOf('Monolog\Handler\Slack\SlackRecord', $slackRecord);
-        $this->assertEquals(array(
-            'username' => 'test-username',
-            'text' => 'test',
-            'channel' => 'test-channel',
-            'icon_emoji' => ':ghost:',
-        ), $slackRecord->getSlackData($this->getRecord()));
-    }
-
-    /**
-     * @covers ::getFormatter
-     */
-    public function testGetFormatter()
-    {
-        $handler = new SlackWebhookHandler(self::WEBHOOK_URL);
-        $formatter = $handler->getFormatter();
-        $this->assertInstanceOf('Monolog\Formatter\FormatterInterface', $formatter);
-    }
-
-    /**
-     * @covers ::setFormatter
-     */
-    public function testSetFormatter()
-    {
-        $handler = new SlackWebhookHandler(self::WEBHOOK_URL);
-        $formatter = new LineFormatter();
-        $handler->setFormatter($formatter);
-        $this->assertSame($formatter, $handler->getFormatter());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SlackbotHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SlackbotHandlerTest.php
deleted file mode 100644
index b1b02bd..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/SlackbotHandlerTest.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-/**
- * @author Haralan Dobrev <hkdobrev@gmail.com>
- * @see    https://slack.com/apps/A0F81R8ET-slackbot
- * @coversDefaultClass Monolog\Handler\SlackbotHandler
- */
-class SlackbotHandlerTest extends TestCase
-{
-    /**
-     * @covers ::__construct
-     */
-    public function testConstructorMinimal()
-    {
-        $handler = new SlackbotHandler('test-team', 'test-token', 'test-channel');
-        $this->assertInstanceOf('Monolog\Handler\AbstractProcessingHandler', $handler);
-    }
-
-    /**
-     * @covers ::__construct
-     */
-    public function testConstructorFull()
-    {
-        $handler = new SlackbotHandler(
-            'test-team',
-            'test-token',
-            'test-channel',
-            Logger::DEBUG,
-            false
-        );
-        $this->assertInstanceOf('Monolog\Handler\AbstractProcessingHandler', $handler);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php
deleted file mode 100644
index 1da987c..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php
+++ /dev/null
@@ -1,335 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-/**
- * @author Pablo de Leon Belloc <pablolb@gmail.com>
- */
-class SocketHandlerTest extends TestCase
-{
-    /**
-     * @var Monolog\Handler\SocketHandler
-     */
-    private $handler;
-
-    /**
-     * @var resource
-     */
-    private $res;
-
-    /**
-     * @expectedException UnexpectedValueException
-     */
-    public function testInvalidHostname()
-    {
-        $this->createHandler('garbage://here');
-        $this->writeRecord('data');
-    }
-
-    /**
-     * @expectedException \InvalidArgumentException
-     */
-    public function testBadConnectionTimeout()
-    {
-        $this->createHandler('localhost:1234');
-        $this->handler->setConnectionTimeout(-1);
-    }
-
-    public function testSetConnectionTimeout()
-    {
-        $this->createHandler('localhost:1234');
-        $this->handler->setConnectionTimeout(10.1);
-        $this->assertEquals(10.1, $this->handler->getConnectionTimeout());
-    }
-
-    /**
-     * @expectedException \InvalidArgumentException
-     */
-    public function testBadTimeout()
-    {
-        $this->createHandler('localhost:1234');
-        $this->handler->setTimeout(-1);
-    }
-
-    public function testSetTimeout()
-    {
-        $this->createHandler('localhost:1234');
-        $this->handler->setTimeout(10.25);
-        $this->assertEquals(10.25, $this->handler->getTimeout());
-    }
-
-    public function testSetWritingTimeout()
-    {
-        $this->createHandler('localhost:1234');
-        $this->handler->setWritingTimeout(10.25);
-        $this->assertEquals(10.25, $this->handler->getWritingTimeout());
-    }
-
-    public function testSetChunkSize()
-    {
-        $this->createHandler('localhost:1234');
-        $this->handler->setChunkSize(1025);
-        $this->assertEquals(1025, $this->handler->getChunkSize());
-    }
-
-    public function testSetConnectionString()
-    {
-        $this->createHandler('tcp://localhost:9090');
-        $this->assertEquals('tcp://localhost:9090', $this->handler->getConnectionString());
-    }
-
-    /**
-     * @expectedException UnexpectedValueException
-     */
-    public function testExceptionIsThrownOnFsockopenError()
-    {
-        $this->setMockHandler(array('fsockopen'));
-        $this->handler->expects($this->once())
-            ->method('fsockopen')
-            ->will($this->returnValue(false));
-        $this->writeRecord('Hello world');
-    }
-
-    /**
-     * @expectedException UnexpectedValueException
-     */
-    public function testExceptionIsThrownOnPfsockopenError()
-    {
-        $this->setMockHandler(array('pfsockopen'));
-        $this->handler->expects($this->once())
-            ->method('pfsockopen')
-            ->will($this->returnValue(false));
-        $this->handler->setPersistent(true);
-        $this->writeRecord('Hello world');
-    }
-
-    /**
-     * @expectedException UnexpectedValueException
-     */
-    public function testExceptionIsThrownIfCannotSetTimeout()
-    {
-        $this->setMockHandler(array('streamSetTimeout'));
-        $this->handler->expects($this->once())
-            ->method('streamSetTimeout')
-            ->will($this->returnValue(false));
-        $this->writeRecord('Hello world');
-    }
-
-    /**
-     * @expectedException UnexpectedValueException
-     */
-    public function testExceptionIsThrownIfCannotSetChunkSize()
-    {
-        $this->setMockHandler(array('streamSetChunkSize'));
-        $this->handler->setChunkSize(8192);
-        $this->handler->expects($this->once())
-            ->method('streamSetChunkSize')
-            ->will($this->returnValue(false));
-        $this->writeRecord('Hello world');
-    }
-
-    /**
-     * @expectedException RuntimeException
-     */
-    public function testWriteFailsOnIfFwriteReturnsFalse()
-    {
-        $this->setMockHandler(array('fwrite'));
-
-        $callback = function ($arg) {
-            $map = array(
-                'Hello world' => 6,
-                'world' => false,
-            );
-
-            return $map[$arg];
-        };
-
-        $this->handler->expects($this->exactly(2))
-            ->method('fwrite')
-            ->will($this->returnCallback($callback));
-
-        $this->writeRecord('Hello world');
-    }
-
-    /**
-     * @expectedException RuntimeException
-     */
-    public function testWriteFailsIfStreamTimesOut()
-    {
-        $this->setMockHandler(array('fwrite', 'streamGetMetadata'));
-
-        $callback = function ($arg) {
-            $map = array(
-                'Hello world' => 6,
-                'world' => 5,
-            );
-
-            return $map[$arg];
-        };
-
-        $this->handler->expects($this->exactly(1))
-            ->method('fwrite')
-            ->will($this->returnCallback($callback));
-        $this->handler->expects($this->exactly(1))
-            ->method('streamGetMetadata')
-            ->will($this->returnValue(array('timed_out' => true)));
-
-        $this->writeRecord('Hello world');
-    }
-
-    /**
-     * @expectedException RuntimeException
-     */
-    public function testWriteFailsOnIncompleteWrite()
-    {
-        $this->setMockHandler(array('fwrite', 'streamGetMetadata'));
-
-        $res = $this->res;
-        $callback = function ($string) use ($res) {
-            fclose($res);
-
-            return strlen('Hello');
-        };
-
-        $this->handler->expects($this->exactly(1))
-            ->method('fwrite')
-            ->will($this->returnCallback($callback));
-        $this->handler->expects($this->exactly(1))
-            ->method('streamGetMetadata')
-            ->will($this->returnValue(array('timed_out' => false)));
-
-        $this->writeRecord('Hello world');
-    }
-
-    public function testWriteWithMemoryFile()
-    {
-        $this->setMockHandler();
-        $this->writeRecord('test1');
-        $this->writeRecord('test2');
-        $this->writeRecord('test3');
-        fseek($this->res, 0);
-        $this->assertEquals('test1test2test3', fread($this->res, 1024));
-    }
-
-    public function testWriteWithMock()
-    {
-        $this->setMockHandler(array('fwrite'));
-
-        $callback = function ($arg) {
-            $map = array(
-                'Hello world' => 6,
-                'world' => 5,
-            );
-
-            return $map[$arg];
-        };
-
-        $this->handler->expects($this->exactly(2))
-            ->method('fwrite')
-            ->will($this->returnCallback($callback));
-
-        $this->writeRecord('Hello world');
-    }
-
-    public function testClose()
-    {
-        $this->setMockHandler();
-        $this->writeRecord('Hello world');
-        $this->assertInternalType('resource', $this->res);
-        $this->handler->close();
-        $this->assertFalse(is_resource($this->res), "Expected resource to be closed after closing handler");
-    }
-
-    public function testCloseDoesNotClosePersistentSocket()
-    {
-        $this->setMockHandler();
-        $this->handler->setPersistent(true);
-        $this->writeRecord('Hello world');
-        $this->assertTrue(is_resource($this->res));
-        $this->handler->close();
-        $this->assertTrue(is_resource($this->res));
-    }
-
-    /**
-     * @expectedException \RuntimeException
-     */
-    public function testAvoidInfiniteLoopWhenNoDataIsWrittenForAWritingTimeoutSeconds()
-    {
-        $this->setMockHandler(array('fwrite', 'streamGetMetadata'));
-
-        $this->handler->expects($this->any())
-            ->method('fwrite')
-            ->will($this->returnValue(0));
-
-        $this->handler->expects($this->any())
-            ->method('streamGetMetadata')
-            ->will($this->returnValue(array('timed_out' => false)));
-
-        $this->handler->setWritingTimeout(1);
-
-        $this->writeRecord('Hello world');
-    }
-
-    private function createHandler($connectionString)
-    {
-        $this->handler = new SocketHandler($connectionString);
-        $this->handler->setFormatter($this->getIdentityFormatter());
-    }
-
-    private function writeRecord($string)
-    {
-        $this->handler->handle($this->getRecord(Logger::WARNING, $string));
-    }
-
-    private function setMockHandler(array $methods = array())
-    {
-        $this->res = fopen('php://memory', 'a');
-
-        $defaultMethods = array('fsockopen', 'pfsockopen', 'streamSetTimeout');
-        $newMethods = array_diff($methods, $defaultMethods);
-
-        $finalMethods = array_merge($defaultMethods, $newMethods);
-
-        $this->handler = $this->getMock(
-            '\Monolog\Handler\SocketHandler', $finalMethods, array('localhost:1234')
-        );
-
-        if (!in_array('fsockopen', $methods)) {
-            $this->handler->expects($this->any())
-                ->method('fsockopen')
-                ->will($this->returnValue($this->res));
-        }
-
-        if (!in_array('pfsockopen', $methods)) {
-            $this->handler->expects($this->any())
-                ->method('pfsockopen')
-                ->will($this->returnValue($this->res));
-        }
-
-        if (!in_array('streamSetTimeout', $methods)) {
-            $this->handler->expects($this->any())
-                ->method('streamSetTimeout')
-                ->will($this->returnValue(true));
-        }
-
-        if (!in_array('streamSetChunkSize', $methods)) {
-            $this->handler->expects($this->any())
-                ->method('streamSetChunkSize')
-                ->will($this->returnValue(8192));
-        }
-
-        $this->handler->setFormatter($this->getIdentityFormatter());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php
deleted file mode 100644
index 487030f..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php
+++ /dev/null
@@ -1,184 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-class StreamHandlerTest extends TestCase
-{
-    /**
-     * @covers Monolog\Handler\StreamHandler::__construct
-     * @covers Monolog\Handler\StreamHandler::write
-     */
-    public function testWrite()
-    {
-        $handle = fopen('php://memory', 'a+');
-        $handler = new StreamHandler($handle);
-        $handler->setFormatter($this->getIdentityFormatter());
-        $handler->handle($this->getRecord(Logger::WARNING, 'test'));
-        $handler->handle($this->getRecord(Logger::WARNING, 'test2'));
-        $handler->handle($this->getRecord(Logger::WARNING, 'test3'));
-        fseek($handle, 0);
-        $this->assertEquals('testtest2test3', fread($handle, 100));
-    }
-
-    /**
-     * @covers Monolog\Handler\StreamHandler::close
-     */
-    public function testCloseKeepsExternalHandlersOpen()
-    {
-        $handle = fopen('php://memory', 'a+');
-        $handler = new StreamHandler($handle);
-        $this->assertTrue(is_resource($handle));
-        $handler->close();
-        $this->assertTrue(is_resource($handle));
-    }
-
-    /**
-     * @covers Monolog\Handler\StreamHandler::close
-     */
-    public function testClose()
-    {
-        $handler = new StreamHandler('php://memory');
-        $handler->handle($this->getRecord(Logger::WARNING, 'test'));
-        $streamProp = new \ReflectionProperty('Monolog\Handler\StreamHandler', 'stream');
-        $streamProp->setAccessible(true);
-        $handle = $streamProp->getValue($handler);
-
-        $this->assertTrue(is_resource($handle));
-        $handler->close();
-        $this->assertFalse(is_resource($handle));
-    }
-
-    /**
-     * @covers Monolog\Handler\StreamHandler::write
-     */
-    public function testWriteCreatesTheStreamResource()
-    {
-        $handler = new StreamHandler('php://memory');
-        $handler->handle($this->getRecord());
-    }
-
-    /**
-     * @covers Monolog\Handler\StreamHandler::__construct
-     * @covers Monolog\Handler\StreamHandler::write
-     */
-    public function testWriteLocking()
-    {
-        $temp = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'monolog_locked_log';
-        $handler = new StreamHandler($temp, Logger::DEBUG, true, null, true);
-        $handler->handle($this->getRecord());
-    }
-
-    /**
-     * @expectedException LogicException
-     * @covers Monolog\Handler\StreamHandler::__construct
-     * @covers Monolog\Handler\StreamHandler::write
-     */
-    public function testWriteMissingResource()
-    {
-        $handler = new StreamHandler(null);
-        $handler->handle($this->getRecord());
-    }
-
-    public function invalidArgumentProvider()
-    {
-        return array(
-            array(1),
-            array(array()),
-            array(array('bogus://url')),
-        );
-    }
-
-    /**
-     * @dataProvider invalidArgumentProvider
-     * @expectedException InvalidArgumentException
-     * @covers Monolog\Handler\StreamHandler::__construct
-     */
-    public function testWriteInvalidArgument($invalidArgument)
-    {
-        $handler = new StreamHandler($invalidArgument);
-    }
-
-    /**
-     * @expectedException UnexpectedValueException
-     * @covers Monolog\Handler\StreamHandler::__construct
-     * @covers Monolog\Handler\StreamHandler::write
-     */
-    public function testWriteInvalidResource()
-    {
-        $handler = new StreamHandler('bogus://url');
-        $handler->handle($this->getRecord());
-    }
-
-    /**
-     * @expectedException UnexpectedValueException
-     * @covers Monolog\Handler\StreamHandler::__construct
-     * @covers Monolog\Handler\StreamHandler::write
-     */
-    public function testWriteNonExistingResource()
-    {
-        $handler = new StreamHandler('ftp://foo/bar/baz/'.rand(0, 10000));
-        $handler->handle($this->getRecord());
-    }
-
-    /**
-     * @covers Monolog\Handler\StreamHandler::__construct
-     * @covers Monolog\Handler\StreamHandler::write
-     */
-    public function testWriteNonExistingPath()
-    {
-        $handler = new StreamHandler(sys_get_temp_dir().'/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000));
-        $handler->handle($this->getRecord());
-    }
-
-    /**
-     * @covers Monolog\Handler\StreamHandler::__construct
-     * @covers Monolog\Handler\StreamHandler::write
-     */
-    public function testWriteNonExistingFileResource()
-    {
-        $handler = new StreamHandler('file://'.sys_get_temp_dir().'/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000));
-        $handler->handle($this->getRecord());
-    }
-
-    /**
-     * @expectedException Exception
-     * @expectedExceptionMessageRegExp /There is no existing directory at/
-     * @covers Monolog\Handler\StreamHandler::__construct
-     * @covers Monolog\Handler\StreamHandler::write
-     */
-    public function testWriteNonExistingAndNotCreatablePath()
-    {
-        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
-            $this->markTestSkipped('Permissions checks can not run on windows');
-        }
-        $handler = new StreamHandler('/foo/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000));
-        $handler->handle($this->getRecord());
-    }
-
-    /**
-     * @expectedException Exception
-     * @expectedExceptionMessageRegExp /There is no existing directory at/
-     * @covers Monolog\Handler\StreamHandler::__construct
-     * @covers Monolog\Handler\StreamHandler::write
-     */
-    public function testWriteNonExistingAndNotCreatableFileResource()
-    {
-        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
-            $this->markTestSkipped('Permissions checks can not run on windows');
-        }
-        $handler = new StreamHandler('file:///foo/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000));
-        $handler->handle($this->getRecord());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SwiftMailerHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SwiftMailerHandlerTest.php
deleted file mode 100644
index 1d62940..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/SwiftMailerHandlerTest.php
+++ /dev/null
@@ -1,113 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\Logger;
-use Monolog\TestCase;
-
-class SwiftMailerHandlerTest extends TestCase
-{
-    /** @var \Swift_Mailer|\PHPUnit_Framework_MockObject_MockObject */
-    private $mailer;
-
-    public function setUp()
-    {
-        $this->mailer = $this
-            ->getMockBuilder('Swift_Mailer')
-            ->disableOriginalConstructor()
-            ->getMock();
-    }
-
-    public function testMessageCreationIsLazyWhenUsingCallback()
-    {
-        $this->mailer->expects($this->never())
-            ->method('send');
-
-        $callback = function () {
-            throw new \RuntimeException('Swift_Message creation callback should not have been called in this test');
-        };
-        $handler = new SwiftMailerHandler($this->mailer, $callback);
-
-        $records = array(
-            $this->getRecord(Logger::DEBUG),
-            $this->getRecord(Logger::INFO),
-        );
-        $handler->handleBatch($records);
-    }
-
-    public function testMessageCanBeCustomizedGivenLoggedData()
-    {
-        // Wire Mailer to expect a specific Swift_Message with a customized Subject
-        $expectedMessage = new \Swift_Message();
-        $this->mailer->expects($this->once())
-            ->method('send')
-            ->with($this->callback(function ($value) use ($expectedMessage) {
-                return $value instanceof \Swift_Message
-                    && $value->getSubject() === 'Emergency'
-                    && $value === $expectedMessage;
-            }));
-
-        // Callback dynamically changes subject based on number of logged records
-        $callback = function ($content, array $records) use ($expectedMessage) {
-            $subject = count($records) > 0 ? 'Emergency' : 'Normal';
-            $expectedMessage->setSubject($subject);
-
-            return $expectedMessage;
-        };
-        $handler = new SwiftMailerHandler($this->mailer, $callback);
-
-        // Logging 1 record makes this an Emergency
-        $records = array(
-            $this->getRecord(Logger::EMERGENCY),
-        );
-        $handler->handleBatch($records);
-    }
-
-    public function testMessageSubjectFormatting()
-    {
-        // Wire Mailer to expect a specific Swift_Message with a customized Subject
-        $messageTemplate = new \Swift_Message();
-        $messageTemplate->setSubject('Alert: %level_name% %message%');
-        $receivedMessage = null;
-
-        $this->mailer->expects($this->once())
-            ->method('send')
-            ->with($this->callback(function ($value) use (&$receivedMessage) {
-                $receivedMessage = $value;
-                return true;
-            }));
-
-        $handler = new SwiftMailerHandler($this->mailer, $messageTemplate);
-
-        $records = array(
-            $this->getRecord(Logger::EMERGENCY),
-        );
-        $handler->handleBatch($records);
-
-        $this->assertEquals('Alert: EMERGENCY test', $receivedMessage->getSubject());
-    }
-
-    public function testMessageHaveUniqueId()
-    {
-        $messageTemplate = new \Swift_Message();
-        $handler = new SwiftMailerHandler($this->mailer, $messageTemplate);
-
-        $method = new \ReflectionMethod('Monolog\Handler\SwiftMailerHandler', 'buildMessage');
-        $method->setAccessible(true);
-        $method->invokeArgs($handler, array($messageTemplate, array()));
-
-        $builtMessage1 = $method->invoke($handler, $messageTemplate, array());
-        $builtMessage2 = $method->invoke($handler, $messageTemplate, array());
-
-        $this->assertFalse($builtMessage1->getId() === $builtMessage2->getId(), 'Two different messages have the same id');
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php
deleted file mode 100644
index 8f9e46b..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\Logger;
-
-class SyslogHandlerTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @covers Monolog\Handler\SyslogHandler::__construct
-     */
-    public function testConstruct()
-    {
-        $handler = new SyslogHandler('test');
-        $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler);
-
-        $handler = new SyslogHandler('test', LOG_USER);
-        $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler);
-
-        $handler = new SyslogHandler('test', 'user');
-        $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler);
-
-        $handler = new SyslogHandler('test', LOG_USER, Logger::DEBUG, true, LOG_PERROR);
-        $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler);
-    }
-
-    /**
-     * @covers Monolog\Handler\SyslogHandler::__construct
-     */
-    public function testConstructInvalidFacility()
-    {
-        $this->setExpectedException('UnexpectedValueException');
-        $handler = new SyslogHandler('test', 'unknown');
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php
deleted file mode 100644
index 7ee8a98..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-
-/**
- * @requires extension sockets
- */
-class SyslogUdpHandlerTest extends TestCase
-{
-    /**
-     * @expectedException UnexpectedValueException
-     */
-    public function testWeValidateFacilities()
-    {
-        $handler = new SyslogUdpHandler("ip", null, "invalidFacility");
-    }
-
-    public function testWeSplitIntoLines()
-    {
-        $time = '2014-01-07T12:34';
-        $pid = getmypid();
-        $host = gethostname();
-
-        $handler = $this->getMockBuilder('\Monolog\Handler\SyslogUdpHandler')
-            ->setConstructorArgs(array("127.0.0.1", 514, "authpriv"))
-            ->setMethods(array('getDateTime'))
-            ->getMock();
-
-        $handler->method('getDateTime')
-            ->willReturn($time);
-
-        $handler->setFormatter(new \Monolog\Formatter\ChromePHPFormatter());
-
-        $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('write'), array('lol', 'lol'));
-        $socket->expects($this->at(0))
-            ->method('write')
-            ->with("lol", "<".(LOG_AUTHPRIV + LOG_WARNING).">1 $time $host php $pid - - ");
-        $socket->expects($this->at(1))
-            ->method('write')
-            ->with("hej", "<".(LOG_AUTHPRIV + LOG_WARNING).">1 $time $host php $pid - - ");
-
-        $handler->setSocket($socket);
-
-        $handler->handle($this->getRecordWithMessage("hej\nlol"));
-    }
-
-    public function testSplitWorksOnEmptyMsg()
-    {
-        $handler = new SyslogUdpHandler("127.0.0.1", 514, "authpriv");
-        $handler->setFormatter($this->getIdentityFormatter());
-
-        $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('write'), array('lol', 'lol'));
-        $socket->expects($this->never())
-            ->method('write');
-
-        $handler->setSocket($socket);
-
-        $handler->handle($this->getRecordWithMessage(null));
-    }
-
-    protected function getRecordWithMessage($msg)
-    {
-        return array('message' => $msg, 'level' => \Monolog\Logger::WARNING, 'context' => null, 'extra' => array(), 'channel' => 'lol');
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php
deleted file mode 100644
index a7c4fc9..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-/**
- * @covers Monolog\Handler\TestHandler
- */
-class TestHandlerTest extends TestCase
-{
-    /**
-     * @dataProvider methodProvider
-     */
-    public function testHandler($method, $level)
-    {
-        $handler = new TestHandler;
-        $record = $this->getRecord($level, 'test'.$method);
-        $this->assertFalse($handler->hasRecords($level));
-        $this->assertFalse($handler->hasRecord($record, $level));
-        $this->assertFalse($handler->{'has'.$method}($record), 'has'.$method);
-        $this->assertFalse($handler->{'has'.$method.'ThatContains'}('test'), 'has'.$method.'ThatContains');
-        $this->assertFalse($handler->{'has'.$method.'ThatPasses'}(function ($rec) {
-            return true;
-        }), 'has'.$method.'ThatPasses');
-        $this->assertFalse($handler->{'has'.$method.'ThatMatches'}('/test\w+/'));
-        $this->assertFalse($handler->{'has'.$method.'Records'}(), 'has'.$method.'Records');
-        $handler->handle($record);
-
-        $this->assertFalse($handler->{'has'.$method}('bar'), 'has'.$method);
-        $this->assertTrue($handler->hasRecords($level));
-        $this->assertTrue($handler->hasRecord($record, $level));
-        $this->assertTrue($handler->{'has'.$method}($record), 'has'.$method);
-        $this->assertTrue($handler->{'has'.$method}('test'.$method), 'has'.$method);
-        $this->assertTrue($handler->{'has'.$method.'ThatContains'}('test'), 'has'.$method.'ThatContains');
-        $this->assertTrue($handler->{'has'.$method.'ThatPasses'}(function ($rec) {
-            return true;
-        }), 'has'.$method.'ThatPasses');
-        $this->assertTrue($handler->{'has'.$method.'ThatMatches'}('/test\w+/'));
-        $this->assertTrue($handler->{'has'.$method.'Records'}(), 'has'.$method.'Records');
-
-        $records = $handler->getRecords();
-        unset($records[0]['formatted']);
-        $this->assertEquals(array($record), $records);
-    }
-
-    public function testHandlerAssertEmptyContext() {
-        $handler = new TestHandler;
-        $record  = $this->getRecord(Logger::WARNING, 'test', array());
-        $this->assertFalse($handler->hasWarning(array(
-            'message' => 'test',
-            'context' => array(),
-        )));
-
-        $handler->handle($record);
-
-        $this->assertTrue($handler->hasWarning(array(
-            'message' => 'test',
-            'context' => array(),
-        )));
-        $this->assertFalse($handler->hasWarning(array(
-            'message' => 'test',
-            'context' => array(
-                'foo' => 'bar'
-            ),
-        )));
-    }
-
-    public function testHandlerAssertNonEmptyContext() {
-        $handler = new TestHandler;
-        $record  = $this->getRecord(Logger::WARNING, 'test', array('foo' => 'bar'));
-        $this->assertFalse($handler->hasWarning(array(
-            'message' => 'test',
-            'context' => array(
-                'foo' => 'bar'
-            ),
-        )));
-
-        $handler->handle($record);
-
-        $this->assertTrue($handler->hasWarning(array(
-            'message' => 'test',
-            'context' => array(
-                'foo' => 'bar'
-            ),
-        )));
-        $this->assertFalse($handler->hasWarning(array(
-            'message' => 'test',
-            'context' => array(),
-        )));
-    }
-
-    public function methodProvider()
-    {
-        return array(
-            array('Emergency', Logger::EMERGENCY),
-            array('Alert'    , Logger::ALERT),
-            array('Critical' , Logger::CRITICAL),
-            array('Error'    , Logger::ERROR),
-            array('Warning'  , Logger::WARNING),
-            array('Info'     , Logger::INFO),
-            array('Notice'   , Logger::NOTICE),
-            array('Debug'    , Logger::DEBUG),
-        );
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php
deleted file mode 100644
index fa524d0..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Handler\SyslogUdp\UdpSocket;
-
-/**
- * @requires extension sockets
- */
-class UdpSocketTest extends TestCase
-{
-    public function testWeDoNotTruncateShortMessages()
-    {
-        $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('send'), array('lol', 'lol'));
-
-        $socket->expects($this->at(0))
-            ->method('send')
-            ->with("HEADER: The quick brown fox jumps over the lazy dog");
-
-        $socket->write("The quick brown fox jumps over the lazy dog", "HEADER: ");
-    }
-
-    public function testLongMessagesAreTruncated()
-    {
-        $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('send'), array('lol', 'lol'));
-
-        $truncatedString = str_repeat("derp", 16254).'d';
-
-        $socket->expects($this->exactly(1))
-            ->method('send')
-            ->with("HEADER" . $truncatedString);
-
-        $longString = str_repeat("derp", 20000);
-
-        $socket->write($longString, "HEADER");
-    }
-
-    public function testDoubleCloseDoesNotError()
-    {
-        $socket = new UdpSocket('127.0.0.1', 514);
-        $socket->close();
-        $socket->close();
-    }
-
-    /**
-     * @expectedException LogicException
-     */
-    public function testWriteAfterCloseErrors()
-    {
-        $socket = new UdpSocket('127.0.0.1', 514);
-        $socket->close();
-        $socket->write('foo', "HEADER");
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php
deleted file mode 100644
index 0594a23..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php
+++ /dev/null
@@ -1,144 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-use Monolog\Logger;
-
-class WhatFailureGroupHandlerTest extends TestCase
-{
-    /**
-     * @covers Monolog\Handler\WhatFailureGroupHandler::__construct
-     * @expectedException InvalidArgumentException
-     */
-    public function testConstructorOnlyTakesHandler()
-    {
-        new WhatFailureGroupHandler(array(new TestHandler(), "foo"));
-    }
-
-    /**
-     * @covers Monolog\Handler\WhatFailureGroupHandler::__construct
-     * @covers Monolog\Handler\WhatFailureGroupHandler::handle
-     */
-    public function testHandle()
-    {
-        $testHandlers = array(new TestHandler(), new TestHandler());
-        $handler = new WhatFailureGroupHandler($testHandlers);
-        $handler->handle($this->getRecord(Logger::DEBUG));
-        $handler->handle($this->getRecord(Logger::INFO));
-        foreach ($testHandlers as $test) {
-            $this->assertTrue($test->hasDebugRecords());
-            $this->assertTrue($test->hasInfoRecords());
-            $this->assertTrue(count($test->getRecords()) === 2);
-        }
-    }
-
-    /**
-     * @covers Monolog\Handler\WhatFailureGroupHandler::handleBatch
-     */
-    public function testHandleBatch()
-    {
-        $testHandlers = array(new TestHandler(), new TestHandler());
-        $handler = new WhatFailureGroupHandler($testHandlers);
-        $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO)));
-        foreach ($testHandlers as $test) {
-            $this->assertTrue($test->hasDebugRecords());
-            $this->assertTrue($test->hasInfoRecords());
-            $this->assertTrue(count($test->getRecords()) === 2);
-        }
-    }
-
-    /**
-     * @covers Monolog\Handler\WhatFailureGroupHandler::isHandling
-     */
-    public function testIsHandling()
-    {
-        $testHandlers = array(new TestHandler(Logger::ERROR), new TestHandler(Logger::WARNING));
-        $handler = new WhatFailureGroupHandler($testHandlers);
-        $this->assertTrue($handler->isHandling($this->getRecord(Logger::ERROR)));
-        $this->assertTrue($handler->isHandling($this->getRecord(Logger::WARNING)));
-        $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));
-    }
-
-    /**
-     * @covers Monolog\Handler\WhatFailureGroupHandler::handle
-     */
-    public function testHandleUsesProcessors()
-    {
-        $test = new TestHandler();
-        $handler = new WhatFailureGroupHandler(array($test));
-        $handler->pushProcessor(function ($record) {
-            $record['extra']['foo'] = true;
-
-            return $record;
-        });
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $this->assertTrue($test->hasWarningRecords());
-        $records = $test->getRecords();
-        $this->assertTrue($records[0]['extra']['foo']);
-    }
-
-    /**
-     * @covers Monolog\Handler\WhatFailureGroupHandler::handleBatch
-     */
-    public function testHandleBatchUsesProcessors()
-    {
-        $testHandlers = array(new TestHandler(), new TestHandler());
-        $handler = new WhatFailureGroupHandler($testHandlers);
-        $handler->pushProcessor(function ($record) {
-            $record['extra']['foo'] = true;
-
-            return $record;
-        });
-        $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO)));
-        foreach ($testHandlers as $test) {
-            $this->assertTrue($test->hasDebugRecords());
-            $this->assertTrue($test->hasInfoRecords());
-            $this->assertTrue(count($test->getRecords()) === 2);
-            $records = $test->getRecords();
-            $this->assertTrue($records[0]['extra']['foo']);
-            $this->assertTrue($records[1]['extra']['foo']);
-        }
-    }
-
-    /**
-     * @covers Monolog\Handler\WhatFailureGroupHandler::handle
-     */
-    public function testHandleException()
-    {
-        $test = new TestHandler();
-        $exception = new ExceptionTestHandler();
-        $handler = new WhatFailureGroupHandler(array($exception, $test, $exception));
-        $handler->pushProcessor(function ($record) {
-            $record['extra']['foo'] = true;
-
-            return $record;
-        });
-        $handler->handle($this->getRecord(Logger::WARNING));
-        $this->assertTrue($test->hasWarningRecords());
-        $records = $test->getRecords();
-        $this->assertTrue($records[0]['extra']['foo']);
-    }
-}
-
-class ExceptionTestHandler extends TestHandler
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function handle(array $record)
-    {
-        parent::handle($record);
-
-        throw new \Exception("ExceptionTestHandler::handle");
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php
deleted file mode 100644
index 69b001e..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Handler;
-
-use Monolog\TestCase;
-
-class ZendMonitorHandlerTest extends TestCase
-{
-    protected $zendMonitorHandler;
-
-    public function setUp()
-    {
-        if (!function_exists('zend_monitor_custom_event')) {
-            $this->markTestSkipped('ZendServer is not installed');
-        }
-    }
-
-    /**
-     * @covers  Monolog\Handler\ZendMonitorHandler::write
-     */
-    public function testWrite()
-    {
-        $record = $this->getRecord();
-        $formatterResult = array(
-            'message' => $record['message'],
-        );
-
-        $zendMonitor = $this->getMockBuilder('Monolog\Handler\ZendMonitorHandler')
-            ->setMethods(array('writeZendMonitorCustomEvent', 'getDefaultFormatter'))
-            ->getMock();
-
-        $formatterMock = $this->getMockBuilder('Monolog\Formatter\NormalizerFormatter')
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $formatterMock->expects($this->once())
-            ->method('format')
-            ->will($this->returnValue($formatterResult));
-
-        $zendMonitor->expects($this->once())
-            ->method('getDefaultFormatter')
-            ->will($this->returnValue($formatterMock));
-
-        $levelMap = $zendMonitor->getLevelMap();
-
-        $zendMonitor->expects($this->once())
-            ->method('writeZendMonitorCustomEvent')
-            ->with($levelMap[$record['level']], $record['message'], $formatterResult);
-
-        $zendMonitor->handle($record);
-    }
-
-    /**
-     * @covers Monolog\Handler\ZendMonitorHandler::getDefaultFormatter
-     */
-    public function testGetDefaultFormatterReturnsNormalizerFormatter()
-    {
-        $zendMonitor = new ZendMonitorHandler();
-        $this->assertInstanceOf('Monolog\Formatter\NormalizerFormatter', $zendMonitor->getDefaultFormatter());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/LoggerTest.php b/vendor/monolog/monolog/tests/Monolog/LoggerTest.php
deleted file mode 100644
index 442e87d..0000000
--- a/vendor/monolog/monolog/tests/Monolog/LoggerTest.php
+++ /dev/null
@@ -1,690 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog;
-
-use Monolog\Processor\WebProcessor;
-use Monolog\Handler\TestHandler;
-
-class LoggerTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @covers Monolog\Logger::getName
-     */
-    public function testGetName()
-    {
-        $logger = new Logger('foo');
-        $this->assertEquals('foo', $logger->getName());
-    }
-
-    /**
-     * @covers Monolog\Logger::getLevelName
-     */
-    public function testGetLevelName()
-    {
-        $this->assertEquals('ERROR', Logger::getLevelName(Logger::ERROR));
-    }
-
-    /**
-     * @covers Monolog\Logger::withName
-     */
-    public function testWithName()
-    {
-        $first = new Logger('first', array($handler = new TestHandler()));
-        $second = $first->withName('second');
-
-        $this->assertSame('first', $first->getName());
-        $this->assertSame('second', $second->getName());
-        $this->assertSame($handler, $second->popHandler());
-    }
-
-    /**
-     * @covers Monolog\Logger::toMonologLevel
-     */
-    public function testConvertPSR3ToMonologLevel()
-    {
-        $this->assertEquals(Logger::toMonologLevel('debug'), 100);
-        $this->assertEquals(Logger::toMonologLevel('info'), 200);
-        $this->assertEquals(Logger::toMonologLevel('notice'), 250);
-        $this->assertEquals(Logger::toMonologLevel('warning'), 300);
-        $this->assertEquals(Logger::toMonologLevel('error'), 400);
-        $this->assertEquals(Logger::toMonologLevel('critical'), 500);
-        $this->assertEquals(Logger::toMonologLevel('alert'), 550);
-        $this->assertEquals(Logger::toMonologLevel('emergency'), 600);
-    }
-
-    /**
-     * @covers Monolog\Logger::getLevelName
-     * @expectedException InvalidArgumentException
-     */
-    public function testGetLevelNameThrows()
-    {
-        Logger::getLevelName(5);
-    }
-
-    /**
-     * @covers Monolog\Logger::__construct
-     */
-    public function testChannel()
-    {
-        $logger = new Logger('foo');
-        $handler = new TestHandler;
-        $logger->pushHandler($handler);
-        $logger->addWarning('test');
-        list($record) = $handler->getRecords();
-        $this->assertEquals('foo', $record['channel']);
-    }
-
-    /**
-     * @covers Monolog\Logger::addRecord
-     */
-    public function testLog()
-    {
-        $logger = new Logger(__METHOD__);
-
-        $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle'));
-        $handler->expects($this->once())
-            ->method('handle');
-        $logger->pushHandler($handler);
-
-        $this->assertTrue($logger->addWarning('test'));
-    }
-
-    /**
-     * @covers Monolog\Logger::addRecord
-     */
-    public function testLogNotHandled()
-    {
-        $logger = new Logger(__METHOD__);
-
-        $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle'), array(Logger::ERROR));
-        $handler->expects($this->never())
-            ->method('handle');
-        $logger->pushHandler($handler);
-
-        $this->assertFalse($logger->addWarning('test'));
-    }
-
-    public function testHandlersInCtor()
-    {
-        $handler1 = new TestHandler;
-        $handler2 = new TestHandler;
-        $logger = new Logger(__METHOD__, array($handler1, $handler2));
-
-        $this->assertEquals($handler1, $logger->popHandler());
-        $this->assertEquals($handler2, $logger->popHandler());
-    }
-
-    public function testProcessorsInCtor()
-    {
-        $processor1 = new WebProcessor;
-        $processor2 = new WebProcessor;
-        $logger = new Logger(__METHOD__, array(), array($processor1, $processor2));
-
-        $this->assertEquals($processor1, $logger->popProcessor());
-        $this->assertEquals($processor2, $logger->popProcessor());
-    }
-
-    /**
-     * @covers Monolog\Logger::pushHandler
-     * @covers Monolog\Logger::popHandler
-     * @expectedException LogicException
-     */
-    public function testPushPopHandler()
-    {
-        $logger = new Logger(__METHOD__);
-        $handler1 = new TestHandler;
-        $handler2 = new TestHandler;
-
-        $logger->pushHandler($handler1);
-        $logger->pushHandler($handler2);
-
-        $this->assertEquals($handler2, $logger->popHandler());
-        $this->assertEquals($handler1, $logger->popHandler());
-        $logger->popHandler();
-    }
-
-    /**
-     * @covers Monolog\Logger::setHandlers
-     */
-    public function testSetHandlers()
-    {
-        $logger = new Logger(__METHOD__);
-        $handler1 = new TestHandler;
-        $handler2 = new TestHandler;
-
-        $logger->pushHandler($handler1);
-        $logger->setHandlers(array($handler2));
-
-        // handler1 has been removed
-        $this->assertEquals(array($handler2), $logger->getHandlers());
-
-        $logger->setHandlers(array(
-            "AMapKey" => $handler1,
-            "Woop" => $handler2,
-        ));
-
-        // Keys have been scrubbed
-        $this->assertEquals(array($handler1, $handler2), $logger->getHandlers());
-    }
-
-    /**
-     * @covers Monolog\Logger::pushProcessor
-     * @covers Monolog\Logger::popProcessor
-     * @expectedException LogicException
-     */
-    public function testPushPopProcessor()
-    {
-        $logger = new Logger(__METHOD__);
-        $processor1 = new WebProcessor;
-        $processor2 = new WebProcessor;
-
-        $logger->pushProcessor($processor1);
-        $logger->pushProcessor($processor2);
-
-        $this->assertEquals($processor2, $logger->popProcessor());
-        $this->assertEquals($processor1, $logger->popProcessor());
-        $logger->popProcessor();
-    }
-
-    /**
-     * @covers Monolog\Logger::pushProcessor
-     * @expectedException InvalidArgumentException
-     */
-    public function testPushProcessorWithNonCallable()
-    {
-        $logger = new Logger(__METHOD__);
-
-        $logger->pushProcessor(new \stdClass());
-    }
-
-    /**
-     * @covers Monolog\Logger::addRecord
-     */
-    public function testProcessorsAreExecuted()
-    {
-        $logger = new Logger(__METHOD__);
-        $handler = new TestHandler;
-        $logger->pushHandler($handler);
-        $logger->pushProcessor(function ($record) {
-            $record['extra']['win'] = true;
-
-            return $record;
-        });
-        $logger->addError('test');
-        list($record) = $handler->getRecords();
-        $this->assertTrue($record['extra']['win']);
-    }
-
-    /**
-     * @covers Monolog\Logger::addRecord
-     */
-    public function testProcessorsAreCalledOnlyOnce()
-    {
-        $logger = new Logger(__METHOD__);
-        $handler = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler->expects($this->any())
-            ->method('isHandling')
-            ->will($this->returnValue(true))
-        ;
-        $handler->expects($this->any())
-            ->method('handle')
-            ->will($this->returnValue(true))
-        ;
-        $logger->pushHandler($handler);
-
-        $processor = $this->getMockBuilder('Monolog\Processor\WebProcessor')
-            ->disableOriginalConstructor()
-            ->setMethods(array('__invoke'))
-            ->getMock()
-        ;
-        $processor->expects($this->once())
-            ->method('__invoke')
-            ->will($this->returnArgument(0))
-        ;
-        $logger->pushProcessor($processor);
-
-        $logger->addError('test');
-    }
-
-    /**
-     * @covers Monolog\Logger::addRecord
-     */
-    public function testProcessorsNotCalledWhenNotHandled()
-    {
-        $logger = new Logger(__METHOD__);
-        $handler = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler->expects($this->once())
-            ->method('isHandling')
-            ->will($this->returnValue(false))
-        ;
-        $logger->pushHandler($handler);
-        $that = $this;
-        $logger->pushProcessor(function ($record) use ($that) {
-            $that->fail('The processor should not be called');
-        });
-        $logger->addAlert('test');
-    }
-
-    /**
-     * @covers Monolog\Logger::addRecord
-     */
-    public function testHandlersNotCalledBeforeFirstHandling()
-    {
-        $logger = new Logger(__METHOD__);
-
-        $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler1->expects($this->never())
-            ->method('isHandling')
-            ->will($this->returnValue(false))
-        ;
-        $handler1->expects($this->once())
-            ->method('handle')
-            ->will($this->returnValue(false))
-        ;
-        $logger->pushHandler($handler1);
-
-        $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler2->expects($this->once())
-            ->method('isHandling')
-            ->will($this->returnValue(true))
-        ;
-        $handler2->expects($this->once())
-            ->method('handle')
-            ->will($this->returnValue(false))
-        ;
-        $logger->pushHandler($handler2);
-
-        $handler3 = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler3->expects($this->once())
-            ->method('isHandling')
-            ->will($this->returnValue(false))
-        ;
-        $handler3->expects($this->never())
-            ->method('handle')
-        ;
-        $logger->pushHandler($handler3);
-
-        $logger->debug('test');
-    }
-
-    /**
-     * @covers Monolog\Logger::addRecord
-     */
-    public function testHandlersNotCalledBeforeFirstHandlingWithAssocArray()
-    {
-        $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler1->expects($this->never())
-            ->method('isHandling')
-            ->will($this->returnValue(false))
-        ;
-        $handler1->expects($this->once())
-            ->method('handle')
-            ->will($this->returnValue(false))
-        ;
-
-        $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler2->expects($this->once())
-            ->method('isHandling')
-            ->will($this->returnValue(true))
-        ;
-        $handler2->expects($this->once())
-            ->method('handle')
-            ->will($this->returnValue(false))
-        ;
-
-        $handler3 = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler3->expects($this->once())
-            ->method('isHandling')
-            ->will($this->returnValue(false))
-        ;
-        $handler3->expects($this->never())
-            ->method('handle')
-        ;
-
-        $logger = new Logger(__METHOD__, array('last' => $handler3, 'second' => $handler2, 'first' => $handler1));
-
-        $logger->debug('test');
-    }
-
-    /**
-     * @covers Monolog\Logger::addRecord
-     */
-    public function testBubblingWhenTheHandlerReturnsFalse()
-    {
-        $logger = new Logger(__METHOD__);
-
-        $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler1->expects($this->any())
-            ->method('isHandling')
-            ->will($this->returnValue(true))
-        ;
-        $handler1->expects($this->once())
-            ->method('handle')
-            ->will($this->returnValue(false))
-        ;
-        $logger->pushHandler($handler1);
-
-        $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler2->expects($this->any())
-            ->method('isHandling')
-            ->will($this->returnValue(true))
-        ;
-        $handler2->expects($this->once())
-            ->method('handle')
-            ->will($this->returnValue(false))
-        ;
-        $logger->pushHandler($handler2);
-
-        $logger->debug('test');
-    }
-
-    /**
-     * @covers Monolog\Logger::addRecord
-     */
-    public function testNotBubblingWhenTheHandlerReturnsTrue()
-    {
-        $logger = new Logger(__METHOD__);
-
-        $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler1->expects($this->any())
-            ->method('isHandling')
-            ->will($this->returnValue(true))
-        ;
-        $handler1->expects($this->never())
-            ->method('handle')
-        ;
-        $logger->pushHandler($handler1);
-
-        $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler2->expects($this->any())
-            ->method('isHandling')
-            ->will($this->returnValue(true))
-        ;
-        $handler2->expects($this->once())
-            ->method('handle')
-            ->will($this->returnValue(true))
-        ;
-        $logger->pushHandler($handler2);
-
-        $logger->debug('test');
-    }
-
-    /**
-     * @covers Monolog\Logger::isHandling
-     */
-    public function testIsHandling()
-    {
-        $logger = new Logger(__METHOD__);
-
-        $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler1->expects($this->any())
-            ->method('isHandling')
-            ->will($this->returnValue(false))
-        ;
-
-        $logger->pushHandler($handler1);
-        $this->assertFalse($logger->isHandling(Logger::DEBUG));
-
-        $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler2->expects($this->any())
-            ->method('isHandling')
-            ->will($this->returnValue(true))
-        ;
-
-        $logger->pushHandler($handler2);
-        $this->assertTrue($logger->isHandling(Logger::DEBUG));
-    }
-
-    /**
-     * @dataProvider logMethodProvider
-     * @covers Monolog\Logger::addDebug
-     * @covers Monolog\Logger::addInfo
-     * @covers Monolog\Logger::addNotice
-     * @covers Monolog\Logger::addWarning
-     * @covers Monolog\Logger::addError
-     * @covers Monolog\Logger::addCritical
-     * @covers Monolog\Logger::addAlert
-     * @covers Monolog\Logger::addEmergency
-     * @covers Monolog\Logger::debug
-     * @covers Monolog\Logger::info
-     * @covers Monolog\Logger::notice
-     * @covers Monolog\Logger::warn
-     * @covers Monolog\Logger::err
-     * @covers Monolog\Logger::crit
-     * @covers Monolog\Logger::alert
-     * @covers Monolog\Logger::emerg
-     */
-    public function testLogMethods($method, $expectedLevel)
-    {
-        $logger = new Logger('foo');
-        $handler = new TestHandler;
-        $logger->pushHandler($handler);
-        $logger->{$method}('test');
-        list($record) = $handler->getRecords();
-        $this->assertEquals($expectedLevel, $record['level']);
-    }
-
-    public function logMethodProvider()
-    {
-        return array(
-            // monolog methods
-            array('addDebug',     Logger::DEBUG),
-            array('addInfo',      Logger::INFO),
-            array('addNotice',    Logger::NOTICE),
-            array('addWarning',   Logger::WARNING),
-            array('addError',     Logger::ERROR),
-            array('addCritical',  Logger::CRITICAL),
-            array('addAlert',     Logger::ALERT),
-            array('addEmergency', Logger::EMERGENCY),
-
-            // ZF/Sf2 compat methods
-            array('debug',  Logger::DEBUG),
-            array('info',   Logger::INFO),
-            array('notice', Logger::NOTICE),
-            array('warn',   Logger::WARNING),
-            array('err',    Logger::ERROR),
-            array('crit',   Logger::CRITICAL),
-            array('alert',  Logger::ALERT),
-            array('emerg',  Logger::EMERGENCY),
-        );
-    }
-
-    /**
-     * @dataProvider setTimezoneProvider
-     * @covers Monolog\Logger::setTimezone
-     */
-    public function testSetTimezone($tz)
-    {
-        Logger::setTimezone($tz);
-        $logger = new Logger('foo');
-        $handler = new TestHandler;
-        $logger->pushHandler($handler);
-        $logger->info('test');
-        list($record) = $handler->getRecords();
-        $this->assertEquals($tz, $record['datetime']->getTimezone());
-    }
-
-    public function setTimezoneProvider()
-    {
-        return array_map(
-            function ($tz) { return array(new \DateTimeZone($tz)); },
-            \DateTimeZone::listIdentifiers()
-        );
-    }
-
-    /**
-     * @dataProvider useMicrosecondTimestampsProvider
-     * @covers Monolog\Logger::useMicrosecondTimestamps
-     * @covers Monolog\Logger::addRecord
-     */
-    public function testUseMicrosecondTimestamps($micro, $assert)
-    {
-        $logger = new Logger('foo');
-        $logger->useMicrosecondTimestamps($micro);
-        $handler = new TestHandler;
-        $logger->pushHandler($handler);
-        $logger->info('test');
-        list($record) = $handler->getRecords();
-        $this->{$assert}('000000', $record['datetime']->format('u'));
-    }
-
-    public function useMicrosecondTimestampsProvider()
-    {
-        return array(
-            // this has a very small chance of a false negative (1/10^6)
-            'with microseconds' => array(true, 'assertNotSame'),
-            'without microseconds' => array(false, PHP_VERSION_ID >= 70100 ? 'assertNotSame' : 'assertSame'),
-        );
-    }
-
-    /**
-     * @covers Monolog\Logger::setExceptionHandler
-     */
-    public function testSetExceptionHandler()
-    {
-        $logger = new Logger(__METHOD__);
-        $this->assertNull($logger->getExceptionHandler());
-        $callback = function ($ex) {
-        };
-        $logger->setExceptionHandler($callback);
-        $this->assertEquals($callback, $logger->getExceptionHandler());
-    }
-
-    /**
-     * @covers Monolog\Logger::setExceptionHandler
-     * @expectedException InvalidArgumentException
-     */
-    public function testBadExceptionHandlerType()
-    {
-        $logger = new Logger(__METHOD__);
-        $logger->setExceptionHandler(false);
-    }
-
-    /**
-     * @covers Monolog\Logger::handleException
-     * @expectedException Exception
-     */
-    public function testDefaultHandleException()
-    {
-        $logger = new Logger(__METHOD__);
-        $handler = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler->expects($this->any())
-            ->method('isHandling')
-            ->will($this->returnValue(true))
-        ;
-        $handler->expects($this->any())
-            ->method('handle')
-            ->will($this->throwException(new \Exception('Some handler exception')))
-        ;
-        $logger->pushHandler($handler);
-        $logger->info('test');
-    }
-
-    /**
-     * @covers Monolog\Logger::handleException
-     * @covers Monolog\Logger::addRecord
-     */
-    public function testCustomHandleException()
-    {
-        $logger = new Logger(__METHOD__);
-        $that = $this;
-        $logger->setExceptionHandler(function ($e, $record) use ($that) {
-            $that->assertEquals($e->getMessage(), 'Some handler exception');
-            $that->assertTrue(is_array($record));
-            $that->assertEquals($record['message'], 'test');
-        });
-        $handler = $this->getMock('Monolog\Handler\HandlerInterface');
-        $handler->expects($this->any())
-            ->method('isHandling')
-            ->will($this->returnValue(true))
-        ;
-        $handler->expects($this->any())
-            ->method('handle')
-            ->will($this->throwException(new \Exception('Some handler exception')))
-        ;
-        $logger->pushHandler($handler);
-        $logger->info('test');
-    }
-
-    public function testReset()
-    {
-        $logger = new Logger('app');
-
-        $testHandler = new Handler\TestHandler();
-        $bufferHandler = new Handler\BufferHandler($testHandler);
-        $groupHandler = new Handler\GroupHandler(array($bufferHandler));
-        $fingersCrossedHandler = new Handler\FingersCrossedHandler($groupHandler);
-
-        $logger->pushHandler($fingersCrossedHandler);
-
-        $processorUid1 = new Processor\UidProcessor(10);
-        $uid1 = $processorUid1->getUid();
-        $groupHandler->pushProcessor($processorUid1);
-
-        $processorUid2 = new Processor\UidProcessor(5);
-        $uid2 = $processorUid2->getUid();
-        $logger->pushProcessor($processorUid2);
-
-        $getProperty = function ($object, $property) {
-            $reflectionProperty = new \ReflectionProperty(get_class($object), $property);
-            $reflectionProperty->setAccessible(true);
-
-            return $reflectionProperty->getValue($object);
-        };
-        $that = $this;
-        $assertBufferOfBufferHandlerEmpty = function () use ($getProperty, $bufferHandler, $that) {
-            $that->assertEmpty($getProperty($bufferHandler, 'buffer'));
-        };
-        $assertBuffersEmpty = function() use ($assertBufferOfBufferHandlerEmpty, $getProperty, $fingersCrossedHandler, $that) {
-            $assertBufferOfBufferHandlerEmpty();
-            $that->assertEmpty($getProperty($fingersCrossedHandler, 'buffer'));
-        };
-
-        $logger->debug('debug');
-        $logger->reset();
-        $assertBuffersEmpty();
-        $this->assertFalse($testHandler->hasDebugRecords());
-        $this->assertFalse($testHandler->hasErrorRecords());
-        $this->assertNotSame($uid1, $uid1 = $processorUid1->getUid());
-        $this->assertNotSame($uid2, $uid2 = $processorUid2->getUid());
-
-        $logger->debug('debug');
-        $logger->error('error');
-        $logger->reset();
-        $assertBuffersEmpty();
-        $this->assertTrue($testHandler->hasDebugRecords());
-        $this->assertTrue($testHandler->hasErrorRecords());
-        $this->assertNotSame($uid1, $uid1 = $processorUid1->getUid());
-        $this->assertNotSame($uid2, $uid2 = $processorUid2->getUid());
-
-        $logger->info('info');
-        $this->assertNotEmpty($getProperty($fingersCrossedHandler, 'buffer'));
-        $assertBufferOfBufferHandlerEmpty();
-        $this->assertFalse($testHandler->hasInfoRecords());
-
-        $logger->reset();
-        $assertBuffersEmpty();
-        $this->assertFalse($testHandler->hasInfoRecords());
-        $this->assertNotSame($uid1, $uid1 = $processorUid1->getUid());
-        $this->assertNotSame($uid2, $uid2 = $processorUid2->getUid());
-
-        $logger->notice('notice');
-        $logger->emergency('emergency');
-        $logger->reset();
-        $assertBuffersEmpty();
-        $this->assertFalse($testHandler->hasInfoRecords());
-        $this->assertTrue($testHandler->hasNoticeRecords());
-        $this->assertTrue($testHandler->hasEmergencyRecords());
-        $this->assertNotSame($uid1, $processorUid1->getUid());
-        $this->assertNotSame($uid2, $processorUid2->getUid());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php
deleted file mode 100644
index 5adb505..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Processor;
-
-use Monolog\TestCase;
-
-class GitProcessorTest extends TestCase
-{
-    /**
-     * @covers Monolog\Processor\GitProcessor::__invoke
-     */
-    public function testProcessor()
-    {
-        $processor = new GitProcessor();
-        $record = $processor($this->getRecord());
-
-        $this->assertArrayHasKey('git', $record['extra']);
-        $this->assertTrue(!is_array($record['extra']['git']['branch']));
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php
deleted file mode 100644
index 0dd411d..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Acme;
-
-class Tester
-{
-    public function test($handler, $record)
-    {
-        $handler->handle($record);
-    }
-}
-
-function tester($handler, $record)
-{
-    $handler->handle($record);
-}
-
-namespace Monolog\Processor;
-
-use Monolog\Logger;
-use Monolog\TestCase;
-use Monolog\Handler\TestHandler;
-
-class IntrospectionProcessorTest extends TestCase
-{
-    public function getHandler()
-    {
-        $processor = new IntrospectionProcessor();
-        $handler = new TestHandler();
-        $handler->pushProcessor($processor);
-
-        return $handler;
-    }
-
-    public function testProcessorFromClass()
-    {
-        $handler = $this->getHandler();
-        $tester = new \Acme\Tester;
-        $tester->test($handler, $this->getRecord());
-        list($record) = $handler->getRecords();
-        $this->assertEquals(__FILE__, $record['extra']['file']);
-        $this->assertEquals(18, $record['extra']['line']);
-        $this->assertEquals('Acme\Tester', $record['extra']['class']);
-        $this->assertEquals('test', $record['extra']['function']);
-    }
-
-    public function testProcessorFromFunc()
-    {
-        $handler = $this->getHandler();
-        \Acme\tester($handler, $this->getRecord());
-        list($record) = $handler->getRecords();
-        $this->assertEquals(__FILE__, $record['extra']['file']);
-        $this->assertEquals(24, $record['extra']['line']);
-        $this->assertEquals(null, $record['extra']['class']);
-        $this->assertEquals('Acme\tester', $record['extra']['function']);
-    }
-
-    public function testLevelTooLow()
-    {
-        $input = array(
-            'level' => Logger::DEBUG,
-            'extra' => array(),
-        );
-
-        $expected = $input;
-
-        $processor = new IntrospectionProcessor(Logger::CRITICAL);
-        $actual = $processor($input);
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testLevelEqual()
-    {
-        $input = array(
-            'level' => Logger::CRITICAL,
-            'extra' => array(),
-        );
-
-        $expected = $input;
-        $expected['extra'] = array(
-            'file' => null,
-            'line' => null,
-            'class' => 'ReflectionMethod',
-            'function' => 'invokeArgs',
-        );
-
-        $processor = new IntrospectionProcessor(Logger::CRITICAL);
-        $actual = $processor($input);
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testLevelHigher()
-    {
-        $input = array(
-            'level' => Logger::EMERGENCY,
-            'extra' => array(),
-        );
-
-        $expected = $input;
-        $expected['extra'] = array(
-            'file' => null,
-            'line' => null,
-            'class' => 'ReflectionMethod',
-            'function' => 'invokeArgs',
-        );
-
-        $processor = new IntrospectionProcessor(Logger::CRITICAL);
-        $actual = $processor($input);
-
-        $this->assertEquals($expected, $actual);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php
deleted file mode 100644
index eb66614..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Processor;
-
-use Monolog\TestCase;
-
-class MemoryPeakUsageProcessorTest extends TestCase
-{
-    /**
-     * @covers Monolog\Processor\MemoryPeakUsageProcessor::__invoke
-     * @covers Monolog\Processor\MemoryProcessor::formatBytes
-     */
-    public function testProcessor()
-    {
-        $processor = new MemoryPeakUsageProcessor();
-        $record = $processor($this->getRecord());
-        $this->assertArrayHasKey('memory_peak_usage', $record['extra']);
-        $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_peak_usage']);
-    }
-
-    /**
-     * @covers Monolog\Processor\MemoryPeakUsageProcessor::__invoke
-     * @covers Monolog\Processor\MemoryProcessor::formatBytes
-     */
-    public function testProcessorWithoutFormatting()
-    {
-        $processor = new MemoryPeakUsageProcessor(true, false);
-        $record = $processor($this->getRecord());
-        $this->assertArrayHasKey('memory_peak_usage', $record['extra']);
-        $this->assertInternalType('int', $record['extra']['memory_peak_usage']);
-        $this->assertGreaterThan(0, $record['extra']['memory_peak_usage']);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php
deleted file mode 100644
index 4692dbf..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Processor;
-
-use Monolog\TestCase;
-
-class MemoryUsageProcessorTest extends TestCase
-{
-    /**
-     * @covers Monolog\Processor\MemoryUsageProcessor::__invoke
-     * @covers Monolog\Processor\MemoryProcessor::formatBytes
-     */
-    public function testProcessor()
-    {
-        $processor = new MemoryUsageProcessor();
-        $record = $processor($this->getRecord());
-        $this->assertArrayHasKey('memory_usage', $record['extra']);
-        $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_usage']);
-    }
-
-    /**
-     * @covers Monolog\Processor\MemoryUsageProcessor::__invoke
-     * @covers Monolog\Processor\MemoryProcessor::formatBytes
-     */
-    public function testProcessorWithoutFormatting()
-    {
-        $processor = new MemoryUsageProcessor(true, false);
-        $record = $processor($this->getRecord());
-        $this->assertArrayHasKey('memory_usage', $record['extra']);
-        $this->assertInternalType('int', $record['extra']['memory_usage']);
-        $this->assertGreaterThan(0, $record['extra']['memory_usage']);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/MercurialProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/MercurialProcessorTest.php
deleted file mode 100644
index 11f2b35..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Processor/MercurialProcessorTest.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jonathan A. Schweder <jonathanschweder@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Processor;
-
-use Monolog\TestCase;
-
-class MercurialProcessorTest extends TestCase
-{
-    /**
-     * @covers Monolog\Processor\MercurialProcessor::__invoke
-     */
-    public function testProcessor()
-    {
-        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
-            exec("where hg 2>NUL", $output, $result);
-        } else {
-            exec("which hg 2>/dev/null >/dev/null", $output, $result);
-        }
-        if ($result != 0) {
-            $this->markTestSkipped('hg is missing');
-            return;
-        }
-
-        `hg init`;
-        $processor = new MercurialProcessor();
-        $record = $processor($this->getRecord());
-
-        $this->assertArrayHasKey('hg', $record['extra']);
-        $this->assertTrue(!is_array($record['extra']['hg']['branch']));
-        $this->assertTrue(!is_array($record['extra']['hg']['revision']));
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php
deleted file mode 100644
index 458d2a3..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Processor;
-
-use Monolog\TestCase;
-
-class ProcessIdProcessorTest extends TestCase
-{
-    /**
-     * @covers Monolog\Processor\ProcessIdProcessor::__invoke
-     */
-    public function testProcessor()
-    {
-        $processor = new ProcessIdProcessor();
-        $record = $processor($this->getRecord());
-        $this->assertArrayHasKey('process_id', $record['extra']);
-        $this->assertInternalType('int', $record['extra']['process_id']);
-        $this->assertGreaterThan(0, $record['extra']['process_id']);
-        $this->assertEquals(getmypid(), $record['extra']['process_id']);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/PsrLogMessageProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/PsrLogMessageProcessorTest.php
deleted file mode 100644
index 029a0c0..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Processor/PsrLogMessageProcessorTest.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Processor;
-
-class PsrLogMessageProcessorTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @dataProvider getPairs
-     */
-    public function testReplacement($val, $expected)
-    {
-        $proc = new PsrLogMessageProcessor;
-
-        $message = $proc(array(
-            'message' => '{foo}',
-            'context' => array('foo' => $val),
-        ));
-        $this->assertEquals($expected, $message['message']);
-    }
-
-    public function getPairs()
-    {
-        return array(
-            array('foo',    'foo'),
-            array('3',      '3'),
-            array(3,        '3'),
-            array(null,     ''),
-            array(true,     '1'),
-            array(false,    ''),
-            array(new \stdClass, '[object stdClass]'),
-            array(array(), '[array]'),
-        );
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/TagProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/TagProcessorTest.php
deleted file mode 100644
index 0d860c6..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Processor/TagProcessorTest.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Processor;
-
-use Monolog\TestCase;
-
-class TagProcessorTest extends TestCase
-{
-    /**
-     * @covers Monolog\Processor\TagProcessor::__invoke
-     */
-    public function testProcessor()
-    {
-        $tags = array(1, 2, 3);
-        $processor = new TagProcessor($tags);
-        $record = $processor($this->getRecord());
-
-        $this->assertEquals($tags, $record['extra']['tags']);
-    }
-
-    /**
-     * @covers Monolog\Processor\TagProcessor::__invoke
-     */
-    public function testProcessorTagModification()
-    {
-        $tags = array(1, 2, 3);
-        $processor = new TagProcessor($tags);
-
-        $record = $processor($this->getRecord());
-        $this->assertEquals($tags, $record['extra']['tags']);
-
-        $processor->setTags(array('a', 'b'));
-        $record = $processor($this->getRecord());
-        $this->assertEquals(array('a', 'b'), $record['extra']['tags']);
-
-        $processor->addTags(array('a', 'c', 'foo' => 'bar'));
-        $record = $processor($this->getRecord());
-        $this->assertEquals(array('a', 'b', 'a', 'c', 'foo' => 'bar'), $record['extra']['tags']);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php
deleted file mode 100644
index 5d13058..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Processor;
-
-use Monolog\TestCase;
-
-class UidProcessorTest extends TestCase
-{
-    /**
-     * @covers Monolog\Processor\UidProcessor::__invoke
-     */
-    public function testProcessor()
-    {
-        $processor = new UidProcessor();
-        $record = $processor($this->getRecord());
-        $this->assertArrayHasKey('uid', $record['extra']);
-    }
-
-    public function testGetUid()
-    {
-        $processor = new UidProcessor(10);
-        $this->assertEquals(10, strlen($processor->getUid()));
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php
deleted file mode 100644
index 4105baf..0000000
--- a/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php
+++ /dev/null
@@ -1,113 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Processor;
-
-use Monolog\TestCase;
-
-class WebProcessorTest extends TestCase
-{
-    public function testProcessor()
-    {
-        $server = array(
-            'REQUEST_URI'    => 'A',
-            'REMOTE_ADDR'    => 'B',
-            'REQUEST_METHOD' => 'C',
-            'HTTP_REFERER'   => 'D',
-            'SERVER_NAME'    => 'F',
-            'UNIQUE_ID'      => 'G',
-        );
-
-        $processor = new WebProcessor($server);
-        $record = $processor($this->getRecord());
-        $this->assertEquals($server['REQUEST_URI'], $record['extra']['url']);
-        $this->assertEquals($server['REMOTE_ADDR'], $record['extra']['ip']);
-        $this->assertEquals($server['REQUEST_METHOD'], $record['extra']['http_method']);
-        $this->assertEquals($server['HTTP_REFERER'], $record['extra']['referrer']);
-        $this->assertEquals($server['SERVER_NAME'], $record['extra']['server']);
-        $this->assertEquals($server['UNIQUE_ID'], $record['extra']['unique_id']);
-    }
-
-    public function testProcessorDoNothingIfNoRequestUri()
-    {
-        $server = array(
-            'REMOTE_ADDR'    => 'B',
-            'REQUEST_METHOD' => 'C',
-        );
-        $processor = new WebProcessor($server);
-        $record = $processor($this->getRecord());
-        $this->assertEmpty($record['extra']);
-    }
-
-    public function testProcessorReturnNullIfNoHttpReferer()
-    {
-        $server = array(
-            'REQUEST_URI'    => 'A',
-            'REMOTE_ADDR'    => 'B',
-            'REQUEST_METHOD' => 'C',
-            'SERVER_NAME'    => 'F',
-        );
-        $processor = new WebProcessor($server);
-        $record = $processor($this->getRecord());
-        $this->assertNull($record['extra']['referrer']);
-    }
-
-    public function testProcessorDoesNotAddUniqueIdIfNotPresent()
-    {
-        $server = array(
-            'REQUEST_URI'    => 'A',
-            'REMOTE_ADDR'    => 'B',
-            'REQUEST_METHOD' => 'C',
-            'SERVER_NAME'    => 'F',
-        );
-        $processor = new WebProcessor($server);
-        $record = $processor($this->getRecord());
-        $this->assertFalse(isset($record['extra']['unique_id']));
-    }
-
-    public function testProcessorAddsOnlyRequestedExtraFields()
-    {
-        $server = array(
-            'REQUEST_URI'    => 'A',
-            'REMOTE_ADDR'    => 'B',
-            'REQUEST_METHOD' => 'C',
-            'SERVER_NAME'    => 'F',
-        );
-
-        $processor = new WebProcessor($server, array('url', 'http_method'));
-        $record = $processor($this->getRecord());
-
-        $this->assertSame(array('url' => 'A', 'http_method' => 'C'), $record['extra']);
-    }
-
-    public function testProcessorConfiguringOfExtraFields()
-    {
-        $server = array(
-            'REQUEST_URI'    => 'A',
-            'REMOTE_ADDR'    => 'B',
-            'REQUEST_METHOD' => 'C',
-            'SERVER_NAME'    => 'F',
-        );
-
-        $processor = new WebProcessor($server, array('url' => 'REMOTE_ADDR'));
-        $record = $processor($this->getRecord());
-
-        $this->assertSame(array('url' => 'B'), $record['extra']);
-    }
-
-    /**
-     * @expectedException UnexpectedValueException
-     */
-    public function testInvalidData()
-    {
-        new WebProcessor(new \stdClass);
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php b/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php
deleted file mode 100644
index ab89944..0000000
--- a/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog;
-
-use Monolog\Handler\TestHandler;
-use Monolog\Formatter\LineFormatter;
-use Monolog\Processor\PsrLogMessageProcessor;
-use Psr\Log\Test\LoggerInterfaceTest;
-
-class PsrLogCompatTest extends LoggerInterfaceTest
-{
-    private $handler;
-
-    public function getLogger()
-    {
-        $logger = new Logger('foo');
-        $logger->pushHandler($handler = new TestHandler);
-        $logger->pushProcessor(new PsrLogMessageProcessor);
-        $handler->setFormatter(new LineFormatter('%level_name% %message%'));
-
-        $this->handler = $handler;
-
-        return $logger;
-    }
-
-    public function getLogs()
-    {
-        $convert = function ($record) {
-            $lower = function ($match) {
-                return strtolower($match[0]);
-            };
-
-            return preg_replace_callback('{^[A-Z]+}', $lower, $record['formatted']);
-        };
-
-        return array_map($convert, $this->handler->getRecords());
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/RegistryTest.php b/vendor/monolog/monolog/tests/Monolog/RegistryTest.php
deleted file mode 100644
index 15fdfbd..0000000
--- a/vendor/monolog/monolog/tests/Monolog/RegistryTest.php
+++ /dev/null
@@ -1,153 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog;
-
-class RegistryTest extends \PHPUnit_Framework_TestCase
-{
-    protected function setUp()
-    {
-        Registry::clear();
-    }
-
-    /**
-     * @dataProvider hasLoggerProvider
-     * @covers Monolog\Registry::hasLogger
-     */
-    public function testHasLogger(array $loggersToAdd, array $loggersToCheck, array $expectedResult)
-    {
-        foreach ($loggersToAdd as $loggerToAdd) {
-            Registry::addLogger($loggerToAdd);
-        }
-        foreach ($loggersToCheck as $index => $loggerToCheck) {
-            $this->assertSame($expectedResult[$index], Registry::hasLogger($loggerToCheck));
-        }
-    }
-
-    public function hasLoggerProvider()
-    {
-        $logger1 = new Logger('test1');
-        $logger2 = new Logger('test2');
-        $logger3 = new Logger('test3');
-
-        return array(
-            // only instances
-            array(
-                array($logger1),
-                array($logger1, $logger2),
-                array(true, false),
-            ),
-            // only names
-            array(
-                array($logger1),
-                array('test1', 'test2'),
-                array(true, false),
-            ),
-            // mixed case
-            array(
-                array($logger1, $logger2),
-                array('test1', $logger2, 'test3', $logger3),
-                array(true, true, false, false),
-            ),
-        );
-    }
-
-    /**
-     * @covers Monolog\Registry::clear
-     */
-    public function testClearClears()
-    {
-        Registry::addLogger(new Logger('test1'), 'log');
-        Registry::clear();
-
-        $this->setExpectedException('\InvalidArgumentException');
-        Registry::getInstance('log');
-    }
-
-    /**
-     * @dataProvider removedLoggerProvider
-     * @covers Monolog\Registry::addLogger
-     * @covers Monolog\Registry::removeLogger
-     */
-    public function testRemovesLogger($loggerToAdd, $remove)
-    {
-        Registry::addLogger($loggerToAdd);
-        Registry::removeLogger($remove);
-
-        $this->setExpectedException('\InvalidArgumentException');
-        Registry::getInstance($loggerToAdd->getName());
-    }
-
-    public function removedLoggerProvider()
-    {
-        $logger1 = new Logger('test1');
-
-        return array(
-            array($logger1, $logger1),
-            array($logger1, 'test1'),
-        );
-    }
-
-    /**
-     * @covers Monolog\Registry::addLogger
-     * @covers Monolog\Registry::getInstance
-     * @covers Monolog\Registry::__callStatic
-     */
-    public function testGetsSameLogger()
-    {
-        $logger1 = new Logger('test1');
-        $logger2 = new Logger('test2');
-
-        Registry::addLogger($logger1, 'test1');
-        Registry::addLogger($logger2);
-
-        $this->assertSame($logger1, Registry::getInstance('test1'));
-        $this->assertSame($logger2, Registry::test2());
-    }
-
-    /**
-     * @expectedException \InvalidArgumentException
-     * @covers Monolog\Registry::getInstance
-     */
-    public function testFailsOnNonExistantLogger()
-    {
-        Registry::getInstance('test1');
-    }
-
-    /**
-     * @covers Monolog\Registry::addLogger
-     */
-    public function testReplacesLogger()
-    {
-        $log1 = new Logger('test1');
-        $log2 = new Logger('test2');
-
-        Registry::addLogger($log1, 'log');
-
-        Registry::addLogger($log2, 'log', true);
-
-        $this->assertSame($log2, Registry::getInstance('log'));
-    }
-
-    /**
-     * @expectedException \InvalidArgumentException
-     * @covers Monolog\Registry::addLogger
-     */
-    public function testFailsOnUnspecifiedReplacement()
-    {
-        $log1 = new Logger('test1');
-        $log2 = new Logger('test2');
-
-        Registry::addLogger($log1, 'log');
-
-        Registry::addLogger($log2, 'log');
-    }
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/SignalHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/SignalHandlerTest.php
deleted file mode 100644
index 9fa0792..0000000
--- a/vendor/monolog/monolog/tests/Monolog/SignalHandlerTest.php
+++ /dev/null
@@ -1,287 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog;
-
-use Monolog\Handler\StreamHandler;
-use Monolog\Handler\TestHandler;
-use Psr\Log\LogLevel;
-
-/**
- * @author Robert Gust-Bardon <robert@gust-bardon.org>
- * @covers Monolog\SignalHandler
- */
-class SignalHandlerTest extends TestCase
-{
-
-    private $asyncSignalHandling;
-    private $blockedSignals;
-    private $signalHandlers;
-
-    protected function setUp()
-    {
-        $this->signalHandlers = array();
-        if (extension_loaded('pcntl')) {
-            if (function_exists('pcntl_async_signals')) {
-                $this->asyncSignalHandling = pcntl_async_signals();
-            }
-            if (function_exists('pcntl_sigprocmask')) {
-                pcntl_sigprocmask(SIG_BLOCK, array(), $this->blockedSignals);
-            }
-        }
-    }
-
-    protected function tearDown()
-    {
-        if ($this->asyncSignalHandling !== null) {
-            pcntl_async_signals($this->asyncSignalHandling);
-        }
-        if ($this->blockedSignals !== null) {
-            pcntl_sigprocmask(SIG_SETMASK, $this->blockedSignals);
-        }
-        if ($this->signalHandlers) {
-            pcntl_signal_dispatch();
-            foreach ($this->signalHandlers as $signo => $handler) {
-                pcntl_signal($signo, $handler);
-            }
-        }
-    }
-
-    private function setSignalHandler($signo, $handler = SIG_DFL) {
-        if (function_exists('pcntl_signal_get_handler')) {
-            $this->signalHandlers[$signo] = pcntl_signal_get_handler($signo);
-        } else {
-            $this->signalHandlers[$signo] = SIG_DFL;
-        }
-        $this->assertTrue(pcntl_signal($signo, $handler));
-    }
-
-    public function testHandleSignal()
-    {
-        $logger = new Logger('test', array($handler = new TestHandler));
-        $errHandler = new SignalHandler($logger);
-        $signo = 2;  // SIGINT.
-        $siginfo = array('signo' => $signo, 'errno' => 0, 'code' => 0);
-        $errHandler->handleSignal($signo, $siginfo);
-        $this->assertCount(1, $handler->getRecords());
-        $this->assertTrue($handler->hasCriticalRecords());
-        $records = $handler->getRecords();
-        $this->assertSame($siginfo, $records[0]['context']);
-    }
-
-    /**
-     * @depends testHandleSignal
-     * @requires extension pcntl
-     * @requires extension posix
-     * @requires function pcntl_signal
-     * @requires function pcntl_signal_dispatch
-     * @requires function posix_getpid
-     * @requires function posix_kill
-     */
-    public function testRegisterSignalHandler()
-    {
-        // SIGCONT and SIGURG should be ignored by default.
-        if (!defined('SIGCONT') || !defined('SIGURG')) {
-            $this->markTestSkipped('This test requires the SIGCONT and SIGURG pcntl constants.');
-        }
-
-        $this->setSignalHandler(SIGCONT, SIG_IGN);
-        $this->setSignalHandler(SIGURG, SIG_IGN);
-
-        $logger = new Logger('test', array($handler = new TestHandler));
-        $errHandler = new SignalHandler($logger);
-        $pid = posix_getpid();
-
-        $this->assertTrue(posix_kill($pid, SIGURG));
-        $this->assertTrue(pcntl_signal_dispatch());
-        $this->assertCount(0, $handler->getRecords());
-
-        $errHandler->registerSignalHandler(SIGURG, LogLevel::INFO, false, false, false);
-
-        $this->assertTrue(posix_kill($pid, SIGCONT));
-        $this->assertTrue(pcntl_signal_dispatch());
-        $this->assertCount(0, $handler->getRecords());
-
-        $this->assertTrue(posix_kill($pid, SIGURG));
-        $this->assertTrue(pcntl_signal_dispatch());
-        $this->assertCount(1, $handler->getRecords());
-        $this->assertTrue($handler->hasInfoThatContains('SIGURG'));
-    }
-
-    /**
-     * @dataProvider defaultPreviousProvider
-     * @depends testRegisterSignalHandler
-     * @requires function pcntl_fork
-     * @requires function pcntl_sigprocmask
-     * @requires function pcntl_waitpid
-     */
-    public function testRegisterDefaultPreviousSignalHandler($signo, $callPrevious, $expected)
-    {
-        $this->setSignalHandler($signo, SIG_DFL);
-
-        $path = tempnam(sys_get_temp_dir(), 'monolog-');
-        $this->assertNotFalse($path);
-
-        $pid = pcntl_fork();
-        if ($pid === 0) {  // Child.
-            $streamHandler = new StreamHandler($path);
-            $streamHandler->setFormatter($this->getIdentityFormatter());
-            $logger = new Logger('test', array($streamHandler));
-            $errHandler = new SignalHandler($logger);
-            $errHandler->registerSignalHandler($signo, LogLevel::INFO, $callPrevious, false, false);
-            pcntl_sigprocmask(SIG_SETMASK, array(SIGCONT));
-            posix_kill(posix_getpid(), $signo);
-            pcntl_signal_dispatch();
-            // If $callPrevious is true, SIGINT should terminate by this line.
-            pcntl_sigprocmask(SIG_BLOCK, array(), $oldset);
-            file_put_contents($path, implode(' ', $oldset), FILE_APPEND);
-            posix_kill(posix_getpid(), $signo);
-            pcntl_signal_dispatch();
-            exit();
-        }
-
-        $this->assertNotSame(-1, $pid);
-        $this->assertNotSame(-1, pcntl_waitpid($pid, $status));
-        $this->assertNotSame(-1, $status);
-        $this->assertSame($expected, file_get_contents($path));
-    }
-
-    public function defaultPreviousProvider()
-    {
-        if (!defined('SIGCONT') || !defined('SIGINT') || !defined('SIGURG')) {
-            return array();
-        }
-
-        return array(
-            array(SIGINT, false, 'Program received signal SIGINT'.SIGCONT.'Program received signal SIGINT'),
-            array(SIGINT, true, 'Program received signal SIGINT'),
-            array(SIGURG, false, 'Program received signal SIGURG'.SIGCONT.'Program received signal SIGURG'),
-            array(SIGURG, true, 'Program received signal SIGURG'.SIGCONT.'Program received signal SIGURG'),
-        );
-    }
-
-    /**
-     * @dataProvider callablePreviousProvider
-     * @depends testRegisterSignalHandler
-     * @requires function pcntl_signal_get_handler
-     */
-    public function testRegisterCallablePreviousSignalHandler($callPrevious)
-    {
-        $this->setSignalHandler(SIGURG, SIG_IGN);
-
-        $logger = new Logger('test', array($handler = new TestHandler));
-        $errHandler = new SignalHandler($logger);
-        $previousCalled = 0;
-        pcntl_signal(SIGURG, function ($signo, array $siginfo = null) use (&$previousCalled) {
-            ++$previousCalled;
-        });
-        $errHandler->registerSignalHandler(SIGURG, LogLevel::INFO, $callPrevious, false, false);
-        $this->assertTrue(posix_kill(posix_getpid(), SIGURG));
-        $this->assertTrue(pcntl_signal_dispatch());
-        $this->assertCount(1, $handler->getRecords());
-        $this->assertTrue($handler->hasInfoThatContains('SIGURG'));
-        $this->assertSame($callPrevious ? 1 : 0, $previousCalled);
-    }
-
-    public function callablePreviousProvider()
-    {
-        return array(
-            array(false),
-            array(true),
-        );
-    }
-
-    /**
-     * @dataProvider restartSyscallsProvider
-     * @depends testRegisterDefaultPreviousSignalHandler
-     * @requires function pcntl_fork
-     * @requires function pcntl_waitpid
-     */
-    public function testRegisterSyscallRestartingSignalHandler($restartSyscalls)
-    {
-        $this->setSignalHandler(SIGURG, SIG_IGN);
-
-        $parentPid = posix_getpid();
-        $microtime = microtime(true);
-
-        $pid = pcntl_fork();
-        if ($pid === 0) {  // Child.
-            usleep(100000);
-            posix_kill($parentPid, SIGURG);
-            usleep(100000);
-            exit();
-        }
-
-        $this->assertNotSame(-1, $pid);
-        $logger = new Logger('test', array($handler = new TestHandler));
-        $errHandler = new SignalHandler($logger);
-        $errHandler->registerSignalHandler(SIGURG, LogLevel::INFO, false, $restartSyscalls, false);
-        if ($restartSyscalls) {
-            // pcntl_wait is expected to be restarted after the signal handler.
-            $this->assertNotSame(-1, pcntl_waitpid($pid, $status));
-        } else {
-            // pcntl_wait is expected to be interrupted when the signal handler is invoked.
-            $this->assertSame(-1, pcntl_waitpid($pid, $status));
-        }
-        $this->assertSame($restartSyscalls, microtime(true) - $microtime > 0.15);
-        $this->assertTrue(pcntl_signal_dispatch());
-        $this->assertCount(1, $handler->getRecords());
-        if ($restartSyscalls) {
-            // The child has already exited.
-            $this->assertSame(-1, pcntl_waitpid($pid, $status));
-        } else {
-            // The child has not exited yet.
-            $this->assertNotSame(-1, pcntl_waitpid($pid, $status));
-        }
-    }
-
-    public function restartSyscallsProvider()
-    {
-        return array(
-            array(false),
-            array(true),
-            array(false),
-            array(true),
-        );
-    }
-
-    /**
-     * @dataProvider asyncProvider
-     * @depends testRegisterDefaultPreviousSignalHandler
-     * @requires function pcntl_async_signals
-     */
-    public function testRegisterAsyncSignalHandler($initialAsync, $desiredAsync, $expectedBefore, $expectedAfter)
-    {
-        $this->setSignalHandler(SIGURG, SIG_IGN);
-        pcntl_async_signals($initialAsync);
-
-        $logger = new Logger('test', array($handler = new TestHandler));
-        $errHandler = new SignalHandler($logger);
-        $errHandler->registerSignalHandler(SIGURG, LogLevel::INFO, false, false, $desiredAsync);
-        $this->assertTrue(posix_kill(posix_getpid(), SIGURG));
-        $this->assertCount($expectedBefore, $handler->getRecords());
-        $this->assertTrue(pcntl_signal_dispatch());
-        $this->assertCount($expectedAfter, $handler->getRecords());
-    }
-
-    public function asyncProvider()
-    {
-        return array(
-            array(false, false, 0, 1),
-            array(false, null, 0, 1),
-            array(false, true, 1, 1),
-            array(true, false, 0, 1),
-            array(true, null, 1, 1),
-            array(true, true, 1, 1),
-        );
-    }
-
-}
diff --git a/vendor/monolog/monolog/tests/Monolog/TestCase.php b/vendor/monolog/monolog/tests/Monolog/TestCase.php
deleted file mode 100644
index 4eb7b4c..0000000
--- a/vendor/monolog/monolog/tests/Monolog/TestCase.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog;
-
-class TestCase extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @return array Record
-     */
-    protected function getRecord($level = Logger::WARNING, $message = 'test', $context = array())
-    {
-        return array(
-            'message' => $message,
-            'context' => $context,
-            'level' => $level,
-            'level_name' => Logger::getLevelName($level),
-            'channel' => 'test',
-            'datetime' => \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true))),
-            'extra' => array(),
-        );
-    }
-
-    /**
-     * @return array
-     */
-    protected function getMultipleRecords()
-    {
-        return array(
-            $this->getRecord(Logger::DEBUG, 'debug message 1'),
-            $this->getRecord(Logger::DEBUG, 'debug message 2'),
-            $this->getRecord(Logger::INFO, 'information'),
-            $this->getRecord(Logger::WARNING, 'warning'),
-            $this->getRecord(Logger::ERROR, 'error'),
-        );
-    }
-
-    /**
-     * @return Monolog\Formatter\FormatterInterface
-     */
-    protected function getIdentityFormatter()
-    {
-        $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');
-        $formatter->expects($this->any())
-            ->method('format')
-            ->will($this->returnCallback(function ($record) { return $record['message']; }));
-
-        return $formatter;
-    }
-}
diff --git a/vendor/overtrue/socialite/.travis.yml b/vendor/overtrue/socialite/.travis.yml
index 2969e3a..39912f9 100644
--- a/vendor/overtrue/socialite/.travis.yml
+++ b/vendor/overtrue/socialite/.travis.yml
@@ -1,11 +1,9 @@
 language: php
 
 php:
-  - 5.5
-  - 5.6
   - 7.0
   - 7.1
-  - hhvm
+  - 7.2
 
 sudo: false
 dist: trusty
diff --git a/vendor/overtrue/socialite/README.md b/vendor/overtrue/socialite/README.md
index b6c8c20..ec7ea88 100644
--- a/vendor/overtrue/socialite/README.md
+++ b/vendor/overtrue/socialite/README.md
@@ -13,25 +13,15 @@
 
 <p align="center">Socialite is an OAuth2 Authentication tool. It is inspired by <a href="https://github.com/laravel/socialite">laravel/socialite</a>, You can easily use it in any PHP project.</p>
 
-
-<p align="center">
-  <br>
-  <b>创造不息,交付不止</b>
-  <br>
-  <a href="https://www.yousails.com">
-    <img src="https://yousails.com/banners/brand.png" width=350>
-  </a>
-</p>
-
 # Requirement
 
 ```
-PHP >= 5.4
+PHP >= 7.0
 ```
 # Installation
 
 ```shell
-$ composer require "overtrue/socialite:~1.1"
+$ composer require "overtrue/socialite" -vvv
 ```
 
 # Usage
@@ -42,6 +32,7 @@ For Laravel 5: [overtrue/laravel-socialite](https://github.com/overtrue/laravel-
 
 ```php
 <?php
+
 use Overtrue\Socialite\SocialiteManager;
 
 $config = [
@@ -64,11 +55,23 @@ echo $response;// or $response->send();
 ```php
 <?php
 
-// ...
+use Overtrue\Socialite\SocialiteManager;
+
+$config = [
+    'github' => [
+        'client_id' => 'your-app-id',
+        'client_secret' => 'your-app-secret',
+        'redirect' => 'http://localhost/socialite/callback.php',
+    ],
+];
+
+$socialite = new SocialiteManager($config);
+
 $user = $socialite->driver('github')->user();
 
 $user->getId();        // 1472352
 $user->getNickname();  // "overtrue"
+$user->getUsername();  // "overtrue"
 $user->getName();      // "安正超"
 $user->getEmail();     // "anzhengchao@gmail.com"
 $user->getProviderName(); // GitHub
@@ -79,9 +82,9 @@ $user->getProviderName(); // GitHub
 
 Now we support the following sites:
 
-`facebook`, `github`, `google`, `linkedin`, `weibo`, `qq`, `wechat`, `wechat_open`, and `douban`.
+`facebook`, `github`, `google`, `linkedin`, `outlook`, `weibo`, `taobao`, `qq`, `wechat`, `douyin`, and `douban`.
 
-Each drive uses the same configuration keys: `client_id`, `client_secret`, `redirect`.
+Each driver uses the same configuration keys: `client_id`, `client_secret`, `redirect`.
 
 Example:
 ```
@@ -94,15 +97,6 @@ Example:
 ...
 ```
 
-Special configuration options for [WeChat Open Platform](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318590&token=&lang=zh_CN)
-```
-'wechat_open' => [
-    'client_id'     => 'your-app-id',
-    'client_secret' => ['your-component-appid', 'your-component-access-token'],
-    'redirect'      => 'http://localhost/socialite/callback.php',
-]
-```
-
 ### Scope
 
 Before redirecting the user, you may also set "scopes" on the request using the scope method. This method will overwrite all existing scopes:
@@ -115,7 +109,7 @@ $response = $socialite->driver('github')
 
 ### Redirect URL
 
-You may also want to dynamic set `redirect`,you can use the following methods to change the `redirect` URL:
+You may also want to dynamicly set `redirect`,you can use the following methods to change the `redirect` URL:
 
 ```php
 $socialite->redirect($url);
@@ -171,7 +165,7 @@ $user = $socialite->driver('weibo')->user();
 }
 ```
 
-You can fetch the user attribute as a array key like this:
+You can fetch the user attribute as a array keys like these:
 
 ```php
 $user['id'];        // 1472352
@@ -181,7 +175,7 @@ $user['email'];     // "anzhengchao@gmail.com"
 ...
 ```
 
-Or using method:
+Or using the method:
 
 ```php
 $user->getId();
@@ -229,7 +223,7 @@ Or set request to `SocialiteManager` instance:
 $socialite->setRequest($request);
 ```
 
-You can get the request from `SocialiteManager` instance by `getRequest()`:
+You can get the request from the `SocialiteManager` instance by `getRequest()`:
 
 ```php
 $request = $socialite->getRequest();
@@ -237,7 +231,7 @@ $request = $socialite->getRequest();
 
 #### Set custom session manager.
 
-By default, the `SocialiteManager` use `Symfony\Component\HttpFoundation\Session\Session` instance as session manager, you can change it as following lines:
+By default, the `SocialiteManager` uses the `Symfony\Component\HttpFoundation\Session\Session` instance as session manager, you can change it as follows:
 
 ```php
 $session = new YourCustomSessionManager();
@@ -259,6 +253,13 @@ Enjoy it! :heart:
 - [微信开放平台 - 网站应用微信登录开发指南](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN)
 - [微信开放平台 - 代公众号发起网页授权](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318590&token=&lang=zh_CN)
 - [豆瓣 - OAuth 2.0 授权机制说明](http://developers.douban.com/wiki/?title=oauth2)
+- [抖音 - 网站应用开发指南](http://open.douyin.com/platform/doc)
+
+## PHP 扩展包开发
+
+> 想知道如何从零开始构建 PHP 扩展包?
+>
+> 请关注我的实战课程,我会在此课程中分享一些扩展开发经验 —— [《PHP 扩展包实战教程 - 从入门到发布》](https://learnku.com/courses/creating-package)
 
 # License
 
diff --git a/vendor/overtrue/socialite/composer.json b/vendor/overtrue/socialite/composer.json
index e2b30e5..60d0a09 100644
--- a/vendor/overtrue/socialite/composer.json
+++ b/vendor/overtrue/socialite/composer.json
@@ -8,13 +8,16 @@
         }
     },
     "require": {
-        "php": ">=5.4.0",
+        "php": ">=7.0",
         "guzzlehttp/guzzle": "~5.0|~6.0",
-        "symfony/http-foundation": "~2.6|~2.7|~2.8|~3.0"
+        "symfony/http-foundation": "^2.7|^3.0|^4.0"
     },
     "require-dev": {
-        "mockery/mockery": "~0.9",
-        "phpunit/phpunit": "~4.0"
+        "mockery/mockery": "~1.2",
+        "phpunit/phpunit": "~6"
+    },
+    "conflict": {
+        "socialiteproviders/weixin": "*"
     },
     "license": "MIT",
     "authors": [
diff --git a/vendor/overtrue/socialite/src/AuthorizeFailedException.php b/vendor/overtrue/socialite/src/AuthorizeFailedException.php
index 1ddf67f..cc2b128 100644
--- a/vendor/overtrue/socialite/src/AuthorizeFailedException.php
+++ b/vendor/overtrue/socialite/src/AuthorizeFailedException.php
@@ -24,7 +24,7 @@ class AuthorizeFailedException extends \RuntimeException
      * Constructor.
      *
      * @param string $message
-     * @param string $body
+     * @param array  $body
      */
     public function __construct($message, $body)
     {
diff --git a/vendor/overtrue/socialite/src/Config.php b/vendor/overtrue/socialite/src/Config.php
index c538560..bbe0862 100644
--- a/vendor/overtrue/socialite/src/Config.php
+++ b/vendor/overtrue/socialite/src/Config.php
@@ -77,18 +77,19 @@ class Config implements ArrayAccess
         }
 
         $keys = explode('.', $key);
+        $config = &$this->config;
 
         while (count($keys) > 1) {
             $key = array_shift($keys);
-            if (!isset($this->config[$key]) || !is_array($this->config[$key])) {
-                $this->config[$key] = [];
+            if (!isset($config[$key]) || !is_array($config[$key])) {
+                $config[$key] = [];
             }
-            $this->config = &$this->config[$key];
+            $config = &$config[$key];
         }
 
-        $this->config[array_shift($keys)] = $value;
+        $config[array_shift($keys)] = $value;
 
-        return $this->config;
+        return $config;
     }
 
     /**
diff --git a/vendor/overtrue/socialite/src/Providers/AbstractProvider.php b/vendor/overtrue/socialite/src/Providers/AbstractProvider.php
index b0557f5..6b7b886 100644
--- a/vendor/overtrue/socialite/src/Providers/AbstractProvider.php
+++ b/vendor/overtrue/socialite/src/Providers/AbstractProvider.php
@@ -102,6 +102,13 @@ abstract class AbstractProvider implements ProviderInterface
     protected $stateless = false;
 
     /**
+     * The options for guzzle\client.
+     *
+     * @var array
+     */
+    protected static $guzzleOptions = ['http_errors' => false];
+
+    /**
      * Create a new provider instance.
      *
      * @param \Symfony\Component\HttpFoundation\Request $request
@@ -254,7 +261,7 @@ abstract class AbstractProvider implements ProviderInterface
             return $this->accessToken;
         }
 
-        $postKey = (version_compare(ClientInterface::VERSION, '6') === 1) ? 'form_params' : 'body';
+        $postKey = (1 === version_compare(ClientInterface::VERSION, '6')) ? 'form_params' : 'body';
 
         $response = $this->getHttpClient()->post($this->getTokenUrl(), [
             'headers' => ['Accept' => 'application/json'],
@@ -329,6 +336,8 @@ abstract class AbstractProvider implements ProviderInterface
     }
 
     /**
+     * @throws \ReflectionException
+     *
      * @return string
      */
     public function getName()
@@ -459,7 +468,19 @@ abstract class AbstractProvider implements ProviderInterface
      */
     protected function getHttpClient()
     {
-        return new Client(['http_errors' => false]);
+        return new Client(self::$guzzleOptions);
+    }
+
+    /**
+     * Set options for Guzzle HTTP client.
+     *
+     * @param array $config
+     *
+     * @return array
+     */
+    public static function setGuzzleOptions($config = [])
+    {
+        return self::$guzzleOptions = $config;
     }
 
     /**
@@ -479,7 +500,7 @@ abstract class AbstractProvider implements ProviderInterface
      */
     protected function isStateless()
     {
-        return $this->stateless;
+        return !$this->request->hasSession() || $this->stateless;
     }
 
     /**
@@ -519,6 +540,10 @@ abstract class AbstractProvider implements ProviderInterface
      */
     protected function makeState()
     {
+        if (!$this->request->hasSession()) {
+            return false;
+        }
+
         $state = sha1(uniqid(mt_rand(1, 1000000), true));
         $session = $this->request->getSession();
 
diff --git a/vendor/overtrue/socialite/src/Providers/FacebookProvider.php b/vendor/overtrue/socialite/src/Providers/FacebookProvider.php
index b5f9864..70f7b2e 100644
--- a/vendor/overtrue/socialite/src/Providers/FacebookProvider.php
+++ b/vendor/overtrue/socialite/src/Providers/FacebookProvider.php
@@ -34,7 +34,7 @@ class FacebookProvider extends AbstractProvider implements ProviderInterface
      *
      * @var string
      */
-    protected $version = 'v2.9';
+    protected $version = 'v3.3';
 
     /**
      * The user fields being requested.
diff --git a/vendor/overtrue/socialite/src/Providers/GoogleProvider.php b/vendor/overtrue/socialite/src/Providers/GoogleProvider.php
index 913e8d3..e74d830 100644
--- a/vendor/overtrue/socialite/src/Providers/GoogleProvider.php
+++ b/vendor/overtrue/socialite/src/Providers/GoogleProvider.php
@@ -36,9 +36,8 @@ class GoogleProvider extends AbstractProvider implements ProviderInterface
      * @var array
      */
     protected $scopes = [
-        'https://www.googleapis.com/auth/plus.me',
-        'https://www.googleapis.com/auth/plus.login',
-        'https://www.googleapis.com/auth/plus.profile.emails.read',
+        'https://www.googleapis.com/auth/userinfo.email',
+        'https://www.googleapis.com/auth/userinfo.profile',
     ];
 
     /**
@@ -46,7 +45,7 @@ class GoogleProvider extends AbstractProvider implements ProviderInterface
      */
     protected function getAuthUrl($state)
     {
-        return $this->buildAuthUrlFromBase('https://accounts.google.com/o/oauth2/auth', $state);
+        return $this->buildAuthUrlFromBase('https://accounts.google.com/o/oauth2/v2/auth', $state);
     }
 
     /**
@@ -54,7 +53,7 @@ class GoogleProvider extends AbstractProvider implements ProviderInterface
      */
     protected function getTokenUrl()
     {
-        return 'https://accounts.google.com/o/oauth2/token';
+        return 'https://www.googleapis.com/oauth2/v4/token';
     }
 
     /**
@@ -66,7 +65,7 @@ class GoogleProvider extends AbstractProvider implements ProviderInterface
      */
     public function getAccessToken($code)
     {
-        $postKey = (version_compare(ClientInterface::VERSION, '6') === 1) ? 'form_params' : 'body';
+        $postKey = (1 === version_compare(ClientInterface::VERSION, '6')) ? 'form_params' : 'body';
 
         $response = $this->getHttpClient()->post($this->getTokenUrl(), [
             $postKey => $this->getTokenFields($code),
@@ -92,10 +91,7 @@ class GoogleProvider extends AbstractProvider implements ProviderInterface
      */
     protected function getUserByToken(AccessTokenInterface $token)
     {
-        $response = $this->getHttpClient()->get('https://www.googleapis.com/plus/v1/people/me?', [
-            'query' => [
-                'prettyPrint' => 'false',
-            ],
+        $response = $this->getHttpClient()->get('https://www.googleapis.com/userinfo/v2/me', [
             'headers' => [
                 'Accept' => 'application/json',
                 'Authorization' => 'Bearer '.$token->getToken(),
@@ -112,11 +108,11 @@ class GoogleProvider extends AbstractProvider implements ProviderInterface
     {
         return new User([
             'id' => $this->arrayItem($user, 'id'),
-            'username' => $this->arrayItem($user, 'emails.0.value'),
-            'nickname' => $this->arrayItem($user, 'nickname'),
-            'name' => $this->arrayItem($user, 'displayName'),
-            'email' => $this->arrayItem($user, 'emails.0.value'),
-            'avatar' => $this->arrayItem($user, 'image.url'),
+            'username' => $this->arrayItem($user, 'email'),
+            'nickname' => $this->arrayItem($user, 'name'),
+            'name' => $this->arrayItem($user, 'name'),
+            'email' => $this->arrayItem($user, 'email'),
+            'avatar' => $this->arrayItem($user, 'picture'),
         ]);
     }
 }
diff --git a/vendor/overtrue/socialite/src/Providers/LinkedinProvider.php b/vendor/overtrue/socialite/src/Providers/LinkedinProvider.php
index 9f8f3ba..019167a 100644
--- a/vendor/overtrue/socialite/src/Providers/LinkedinProvider.php
+++ b/vendor/overtrue/socialite/src/Providers/LinkedinProvider.php
@@ -27,25 +27,29 @@ class LinkedinProvider extends AbstractProvider implements ProviderInterface
      *
      * @var array
      */
-    protected $scopes = ['r_basicprofile', 'r_emailaddress'];
+    protected $scopes = ['r_liteprofile', 'r_emailaddress'];
 
     /**
-     * The fields that are included in the profile.
-     *
-     * @var array
+     * {@inheritdoc}
      */
-    protected $fields = [
-        'id', 'first-name', 'last-name', 'formatted-name',
-        'email-address', 'headline', 'location', 'industry',
-        'public-profile-url', 'picture-url', 'picture-urls::(original)',
-    ];
+    protected function getAuthUrl($state)
+    {
+        return $this->buildAuthUrlFromBase('https://www.linkedin.com/oauth/v2/authorization', $state);
+    }
 
     /**
-     * {@inheritdoc}
+     * Get the access token for the given code.
+     *
+     * @param string $code
+     *
+     * @return \Overtrue\Socialite\AccessToken
      */
-    protected function getAuthUrl($state)
+    public function getAccessToken($code)
     {
-        return $this->buildAuthUrlFromBase('https://www.linkedin.com/uas/oauth2/authorization', $state);
+        $response = $this->getHttpClient()
+            ->post($this->getTokenUrl(), ['form_params' => $this->getTokenFields($code)]);
+
+        return $this->parseAccessToken($response->getBody());
     }
 
     /**
@@ -53,7 +57,7 @@ class LinkedinProvider extends AbstractProvider implements ProviderInterface
      */
     protected function getTokenUrl()
     {
-        return 'https://www.linkedin.com/uas/oauth2/accessToken';
+        return 'https://www.linkedin.com/oauth/v2/accessToken';
     }
 
     /**
@@ -73,18 +77,52 @@ class LinkedinProvider extends AbstractProvider implements ProviderInterface
      */
     protected function getUserByToken(AccessTokenInterface $token)
     {
-        $fields = implode(',', $this->fields);
+        $basicProfile = $this->getBasicProfile($token);
+        $emailAddress = $this->getEmailAddress($token);
 
-        $url = 'https://api.linkedin.com/v1/people/~:('.$fields.')';
+        return array_merge($basicProfile, $emailAddress);
+    }
+
+    /**
+     * Get the basic profile fields for the user.
+     *
+     * @param string $token
+     *
+     * @return array
+     */
+    protected function getBasicProfile($token)
+    {
+        $url = 'https://api.linkedin.com/v2/me?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams))';
 
         $response = $this->getHttpClient()->get($url, [
             'headers' => [
-                'x-li-format' => 'json',
                 'Authorization' => 'Bearer '.$token,
+                'X-RestLi-Protocol-Version' => '2.0.0',
             ],
         ]);
 
-        return json_decode($response->getBody(), true);
+        return (array) json_decode($response->getBody(), true);
+    }
+
+    /**
+     * Get the email address for the user.
+     *
+     * @param string $token
+     *
+     * @return array
+     */
+    protected function getEmailAddress($token)
+    {
+        $url = 'https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))';
+
+        $response = $this->getHttpClient()->get($url, [
+            'headers' => [
+                'Authorization' => 'Bearer '.$token,
+                'X-RestLi-Protocol-Version' => '2.0.0',
+            ],
+        ]);
+
+        return (array) $this->arrayItem(json_decode($response->getBody(), true), 'elements.0.handle~');
     }
 
     /**
@@ -92,13 +130,28 @@ class LinkedinProvider extends AbstractProvider implements ProviderInterface
      */
     protected function mapUserToObject(array $user)
     {
+        $preferredLocale = $this->arrayItem($user, 'firstName.preferredLocale.language').'_'.$this->arrayItem($user, 'firstName.preferredLocale.country');
+        $firstName = $this->arrayItem($user, 'firstName.localized.'.$preferredLocale);
+        $lastName = $this->arrayItem($user, 'lastName.localized.'.$preferredLocale);
+        $name = $firstName.' '.$lastName;
+
+        $images = (array) $this->arrayItem($user, 'profilePicture.displayImage~.elements', []);
+        $avatars = array_filter($images, function ($image) {
+            return $image['data']['com.linkedin.digitalmedia.mediaartifact.StillImage']['storageSize']['width'] === 100;
+        });
+        $avatar = array_shift($avatars);
+        $originalAvatars = array_filter($images, function ($image) {
+            return $image['data']['com.linkedin.digitalmedia.mediaartifact.StillImage']['storageSize']['width'] === 800;
+        });
+        $originalAvatar = array_shift($originalAvatars);
+
         return new User([
             'id' => $this->arrayItem($user, 'id'),
-            'nickname' => $this->arrayItem($user, 'formattedName'),
-            'name' => $this->arrayItem($user, 'formattedName'),
+            'nickname' => $name,
+            'name' => $name,
             'email' => $this->arrayItem($user, 'emailAddress'),
-            'avatar' => $this->arrayItem($user, 'pictureUrl'),
-            'avatar_original' => $this->arrayItem($user, 'pictureUrls.values.0'),
+            'avatar' => $avatar ? $this->arrayItem($avatar, 'identifiers.0.identifier') : null,
+            'avatar_original' => $originalAvatar ? $this->arrayItem($originalAvatar, 'identifiers.0.identifier') : null,
         ]);
     }
 
@@ -115,4 +168,14 @@ class LinkedinProvider extends AbstractProvider implements ProviderInterface
 
         return $this;
     }
+
+    /**
+     * Determine if the provider is operating as stateless.
+     *
+     * @return bool
+     */
+    protected function isStateless()
+    {
+        return true;
+    }
 }
diff --git a/vendor/overtrue/socialite/src/Providers/QQProvider.php b/vendor/overtrue/socialite/src/Providers/QQProvider.php
index 1704912..921bc20 100644
--- a/vendor/overtrue/socialite/src/Providers/QQProvider.php
+++ b/vendor/overtrue/socialite/src/Providers/QQProvider.php
@@ -195,7 +195,7 @@ class QQProvider extends AbstractProvider implements ProviderInterface
      */
     protected function removeCallback($response)
     {
-        if (strpos($response, 'callback') !== false) {
+        if (false !== strpos($response, 'callback')) {
             $lpos = strpos($response, '(');
             $rpos = strrpos($response, ')');
             $response = substr($response, $lpos + 1, $rpos - $lpos - 1);
diff --git a/vendor/overtrue/socialite/src/Providers/WeChatOpenPlatformProvider.php b/vendor/overtrue/socialite/src/Providers/WeChatOpenPlatformProvider.php
deleted file mode 100644
index 6ff9c5b..0000000
--- a/vendor/overtrue/socialite/src/Providers/WeChatOpenPlatformProvider.php
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/socialite.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Overtrue\Socialite\Providers;
-
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Class WeChatProvider.
- *
- * @see https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318590&token=&lang=zh_CN [WeChat - 公众开放平台代公众号 OAuth 文档]
- */
-class WeChatOpenPlatformProvider extends WeChatProvider
-{
-    /**
-     * Component AppId.
-     *
-     * @deprecated 2.0 Will be removed in the future
-     *
-     * @var string
-     */
-    protected $componentAppId;
-
-    /**
-     * Component Access Token.
-     *
-     * @deprecated 2.0 Will be removed in the future
-     *
-     * @var string
-     */
-    protected $componentAccessToken;
-
-    /**
-     * @var \EasyWeChat\OpenPlatform\AccessToken|array
-     */
-    protected $credentials;
-
-    /**
-     * {@inheritdoc}.
-     */
-    protected $scopes = ['snsapi_base'];
-
-    /**
-     * Create a new provider instance.
-     * (Overriding).
-     *
-     * @param \Symfony\Component\HttpFoundation\Request  $request
-     * @param string                                     $clientId
-     * @param \EasyWeChat\OpenPlatform\AccessToken|array $credentials
-     * @param string|null                                $redirectUrl
-     */
-    public function __construct(Request $request, $clientId, $credentials, $redirectUrl = null)
-    {
-        parent::__construct($request, $clientId, null, $redirectUrl);
-
-        $this->credentials = $credentials;
-        if (is_array($credentials)) {
-            list($this->componentAppId, $this->componentAccessToken) = $credentials;
-        }
-    }
-
-    /**
-     * {@inheritdoc}.
-     */
-    public function getCodeFields($state = null)
-    {
-        $this->with(['component_appid' => $this->componentAppId()]);
-
-        return parent::getCodeFields($state);
-    }
-
-    /**
-     * {@inheritdoc}.
-     */
-    protected function getTokenUrl()
-    {
-        return $this->baseUrl.'/oauth2/component/access_token';
-    }
-
-    /**
-     * {@inheritdoc}.
-     */
-    protected function getTokenFields($code)
-    {
-        return [
-            'appid' => $this->clientId,
-            'component_appid' => $this->componentAppId(),
-            'component_access_token' => $this->componentAccessToken(),
-            'code' => $code,
-            'grant_type' => 'authorization_code',
-        ];
-    }
-
-    /**
-     * Get component app id.
-     *
-     * @return string
-     */
-    protected function componentAppId()
-    {
-        return $this->componentAppId ?: $this->credentials->getAppId();
-    }
-
-    /**
-     * Get component access token.
-     *
-     * @return string
-     */
-    protected function componentAccessToken()
-    {
-        return $this->componentAccessToken ?: $this->credentials->getToken();
-    }
-}
diff --git a/vendor/overtrue/socialite/src/Providers/WeChatProvider.php b/vendor/overtrue/socialite/src/Providers/WeChatProvider.php
index 39e5025..8fb48d3 100644
--- a/vendor/overtrue/socialite/src/Providers/WeChatProvider.php
+++ b/vendor/overtrue/socialite/src/Providers/WeChatProvider.php
@@ -11,7 +11,6 @@
 
 namespace Overtrue\Socialite\Providers;
 
-use Overtrue\Socialite\AccessToken;
 use Overtrue\Socialite\AccessTokenInterface;
 use Overtrue\Socialite\InvalidArgumentException;
 use Overtrue\Socialite\ProviderInterface;
@@ -142,6 +141,7 @@ class WeChatProvider extends AbstractProvider implements ProviderInterface
             'response_type' => 'code',
             'scope' => $this->formatScopes($this->scopes, $this->scopeSeparator),
             'state' => $state ?: md5(time()),
+            'connect_redirect' => 1,
         ], $this->parameters);
     }
 
@@ -223,7 +223,7 @@ class WeChatProvider extends AbstractProvider implements ProviderInterface
      */
     protected function removeCallback($response)
     {
-        if (strpos($response, 'callback') !== false) {
+        if (false !== strpos($response, 'callback')) {
             $lpos = strpos($response, '(');
             $rpos = strrpos($response, ')');
             $response = substr($response, $lpos + 1, $rpos - $lpos - 1);
diff --git a/vendor/overtrue/socialite/src/SocialiteManager.php b/vendor/overtrue/socialite/src/SocialiteManager.php
index 3e7c2dd..8e99cf0 100644
--- a/vendor/overtrue/socialite/src/SocialiteManager.php
+++ b/vendor/overtrue/socialite/src/SocialiteManager.php
@@ -48,16 +48,18 @@ class SocialiteManager implements FactoryInterface
      * @var array
      */
     protected $initialDrivers = [
-            'facebook' => 'Facebook',
-            'github' => 'GitHub',
-            'google' => 'Google',
-            'linkedin' => 'Linkedin',
-            'weibo' => 'Weibo',
-            'qq' => 'QQ',
-            'wechat' => 'WeChat',
-            'wechat_open' => 'WeChatOpenPlatform',
-            'douban' => 'Douban',
-            'wework' => 'WeWork',
+        'facebook' => 'Facebook',
+        'github' => 'GitHub',
+        'google' => 'Google',
+        'linkedin' => 'Linkedin',
+        'weibo' => 'Weibo',
+        'qq' => 'QQ',
+        'wechat' => 'WeChat',
+        'douban' => 'Douban',
+        'wework' => 'WeWork',
+        'outlook' => 'Outlook',
+        'douyin' => 'DouYin',
+        'taobao' => 'Taobao',
     ];
 
     /**
@@ -77,6 +79,10 @@ class SocialiteManager implements FactoryInterface
     {
         $this->config = new Config($config);
 
+        if ($this->config->has('guzzle')) {
+            Providers\AbstractProvider::setGuzzleOptions($this->config->get('guzzle'));
+        }
+
         if ($request) {
             $this->setRequest($request);
         }
@@ -220,8 +226,10 @@ class SocialiteManager implements FactoryInterface
     public function buildProvider($provider, $config)
     {
         return new $provider(
-            $this->getRequest(), $config['client_id'],
-            $config['client_secret'], $config['redirect']
+            $this->getRequest(),
+            $config['client_id'],
+            $config['client_secret'],
+            $config['redirect']
         );
     }
 
diff --git a/vendor/overtrue/socialite/src/User.php b/vendor/overtrue/socialite/src/User.php
index 3d9f18f..82827dd 100644
--- a/vendor/overtrue/socialite/src/User.php
+++ b/vendor/overtrue/socialite/src/User.php
@@ -17,7 +17,7 @@ use JsonSerializable;
 /**
  * Class User.
  */
-class User implements ArrayAccess, UserInterface, JsonSerializable
+class User implements ArrayAccess, UserInterface, JsonSerializable, \Serializable
 {
     use HasAttributes;
 
@@ -100,7 +100,7 @@ class User implements ArrayAccess, UserInterface, JsonSerializable
      */
     public function setToken(AccessTokenInterface $token)
     {
-        $this->setAttribute('token', $token);
+        $this->setAttribute('token', $token->getToken());
 
         return $this;
     }
@@ -132,7 +132,7 @@ class User implements ArrayAccess, UserInterface, JsonSerializable
      */
     public function getToken()
     {
-        return $this->getAttribute('token');
+        return new AccessToken(['access_token' => $this->getAttribute('token')]);
     }
 
     /**
@@ -160,6 +160,27 @@ class User implements ArrayAccess, UserInterface, JsonSerializable
      */
     public function jsonSerialize()
     {
-        return array_merge($this->attributes, ['token' => $this->token->getAttributes()]);
+        return $this->attributes;
+    }
+
+    public function serialize()
+    {
+        return serialize($this->attributes);
+    }
+
+    /**
+     * Constructs the object.
+     *
+     * @see  https://php.net/manual/en/serializable.unserialize.php
+     *
+     * @param string $serialized <p>
+     *                           The string representation of the object.
+     *                           </p>
+     *
+     * @since 5.1.0
+     */
+    public function unserialize($serialized)
+    {
+        $this->attributes = \unserialize($serialized) ?? [];
     }
 }
diff --git a/vendor/overtrue/socialite/tests/OAuthTest.php b/vendor/overtrue/socialite/tests/OAuthTest.php
index 92e4006..c637606 100644
--- a/vendor/overtrue/socialite/tests/OAuthTest.php
+++ b/vendor/overtrue/socialite/tests/OAuthTest.php
@@ -13,9 +13,10 @@ use Mockery as m;
 use Overtrue\Socialite\AccessTokenInterface;
 use Overtrue\Socialite\Providers\AbstractProvider;
 use Overtrue\Socialite\User;
+use PHPUnit\Framework\TestCase;
 use Symfony\Component\HttpFoundation\Request;
 
-class OAuthTest extends PHPUnit_Framework_TestCase
+class OAuthTest extends TestCase
 {
     public function tearDown()
     {
diff --git a/vendor/overtrue/socialite/tests/Providers/WeWorkProviderTest.php b/vendor/overtrue/socialite/tests/Providers/WeWorkProviderTest.php
index ffa3c5d..88377a7 100644
--- a/vendor/overtrue/socialite/tests/Providers/WeWorkProviderTest.php
+++ b/vendor/overtrue/socialite/tests/Providers/WeWorkProviderTest.php
@@ -10,9 +10,10 @@
  */
 
 use Overtrue\Socialite\Providers\WeWorkProvider;
+use PHPUnit\Framework\TestCase;
 use Symfony\Component\HttpFoundation\Request;
 
-class WeWorkProviderTest extends PHPUnit_Framework_TestCase
+class WeWorkProviderTest extends TestCase
 {
     public function testQrConnect()
     {
diff --git a/vendor/overtrue/socialite/tests/WechatProviderTest.php b/vendor/overtrue/socialite/tests/WechatProviderTest.php
index 90e920f..7576b02 100644
--- a/vendor/overtrue/socialite/tests/WechatProviderTest.php
+++ b/vendor/overtrue/socialite/tests/WechatProviderTest.php
@@ -9,11 +9,11 @@
  * with this source code in the file LICENSE.
  */
 
-use Overtrue\Socialite\Providers\WeChatOpenPlatformProvider as RealWeChatOpenPlatformProvider;
 use Overtrue\Socialite\Providers\WeChatProvider as RealWeChatProvider;
+use PHPUnit\Framework\TestCase;
 use Symfony\Component\HttpFoundation\Request;
 
-class WechatProviderTest extends PHPUnit_Framework_TestCase
+class WechatProviderTest extends TestCase
 {
     public function testWeChatProviderHasCorrectlyRedirectResponse()
     {
@@ -24,15 +24,6 @@ class WechatProviderTest extends PHPUnit_Framework_TestCase
         $this->assertRegExp('/redirect_uri=http%3A%2F%2Flocalhost%2Fsocialite%2Fcallback.php/', $response->getTargetUrl());
     }
 
-    public function testWeChatOpenPlatformProviderHasCorrectlyRedirectResponse()
-    {
-        $response = (new WeChatOpenPlatformProvider(Request::create('foo'), 'client_id', ['component-app-id', 'component-access-token'], 'http://localhost/callback.php'))->redirect();
-
-        $this->assertInstanceOf('Symfony\Component\HttpFoundation\RedirectResponse', $response);
-        $this->assertStringStartsWith('https://open.weixin.qq.com/connect/oauth2/authorize', $response->getTargetUrl());
-        $this->assertRegExp('/redirect_uri=http%3A%2F%2Flocalhost%2Fcallback.php/', $response->getTargetUrl());
-    }
-
     public function testWeChatProviderTokenUrlAndRequestFields()
     {
         $provider = new WeChatProvider(Request::create('foo'), 'client_id', 'client_secret', 'http://localhost/socialite/callback.php');
@@ -51,31 +42,10 @@ class WechatProviderTest extends PHPUnit_Framework_TestCase
             'response_type' => 'code',
             'scope' => 'snsapi_login',
             'state' => 'wechat-state',
+            'connect_redirect' => 1,
         ], $provider->codeFields('wechat-state'));
     }
 
-    public function testWeChatOpenPlatformProviderTokenUrlAndRequestFields()
-    {
-        $provider = new WeChatOpenPlatformProvider(Request::create('foo'), 'client_id', ['component-app-id', 'component-access-token'], 'redirect-url');
-
-        $this->assertSame('https://api.weixin.qq.com/sns/oauth2/component/access_token', $provider->tokenUrl());
-        $this->assertSame([
-            'appid' => 'client_id',
-            'component_appid' => 'component-app-id',
-            'component_access_token' => 'component-access-token',
-            'code' => 'code',
-            'grant_type' => 'authorization_code',
-        ], $provider->tokenFields('code'));
-        $this->assertSame([
-            'appid' => 'client_id',
-            'redirect_uri' => 'redirect-url',
-            'response_type' => 'code',
-            'scope' => 'snsapi_base',
-            'state' => 'state',
-            'component_appid' => 'component-app-id',
-        ], $provider->codeFields('state'));
-    }
-
     public function testOpenPlatformComponent()
     {
         $provider = new WeChatProvider(Request::create('foo'), 'client_id', null, 'redirect-url');
@@ -86,6 +56,7 @@ class WechatProviderTest extends PHPUnit_Framework_TestCase
             'response_type' => 'code',
             'scope' => 'snsapi_base',
             'state' => 'state',
+            'connect_redirect' => 1,
             'component_appid' => 'component-app-id',
         ], $provider->codeFields('state'));
 
@@ -124,11 +95,6 @@ class WeChatProvider extends RealWeChatProvider
     use ProviderTrait;
 }
 
-class WeChatOpenPlatformProvider extends RealWeChatOpenPlatformProvider
-{
-    use ProviderTrait;
-}
-
 class WeChatComponent implements \Overtrue\Socialite\WeChatComponentInterface
 {
     public function getAppId()
diff --git a/vendor/overtrue/wechat/.phplint.yml b/vendor/overtrue/wechat/.phplint.yml
deleted file mode 100644
index 2055ec6..0000000
--- a/vendor/overtrue/wechat/.phplint.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-path: ./
-jobs: 10
-exclude:
-  - .github
-  - build
-  - vendor
\ No newline at end of file
diff --git a/vendor/overtrue/wechat/.styleci.yml b/vendor/overtrue/wechat/.styleci.yml
deleted file mode 100644
index 5630a10..0000000
--- a/vendor/overtrue/wechat/.styleci.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-preset: symfony
-
-linting: true
-
-enabled:
-  - strict
-  - strict_param
-  - ordered_use
diff --git a/vendor/overtrue/wechat/BACKERS.md b/vendor/overtrue/wechat/BACKERS.md
deleted file mode 100644
index 7c2d75b..0000000
--- a/vendor/overtrue/wechat/BACKERS.md
+++ /dev/null
@@ -1,3 +0,0 @@
-
-- [优帆远扬](https://www.yousails.com) ¥500 / monthly
-- [Laravist.com](https://laravist.com) ¥750 
\ No newline at end of file
diff --git a/vendor/overtrue/wechat/LICENSE b/vendor/overtrue/wechat/LICENSE
index 18e1664..f80ba02 100644
--- a/vendor/overtrue/wechat/LICENSE
+++ b/vendor/overtrue/wechat/LICENSE
@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) 2015 overtrue <i@overtrue.me>
+Copyright (c) overtrue <i@overtrue.me>
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/overtrue/wechat/README.md b/vendor/overtrue/wechat/README.md
index 189f034..1539c52 100644
--- a/vendor/overtrue/wechat/README.md
+++ b/vendor/overtrue/wechat/README.md
@@ -1,64 +1,30 @@
-<p align="center">
-<a href="https://easywechat.org/">
-<img src="https://easywechat.org/logo.svg" alt="EasyWeChat" width="160">
-</a>
-
-<p align="center">📦 It is probably the best SDK in the world for developing Wechat App.</p>
-
-<p align="center">
-<a href="https://travis-ci.org/overtrue/wechat"><img src="https://travis-ci.org/overtrue/wechat.svg?branch=master" alt="Build Status"></a>
-<a href="https://packagist.org/packages/overtrue/wechat"><img src="https://poser.pugx.org/overtrue/wechat/v/stable.svg" alt="Latest Stable Version"></a>
-<a href="https://packagist.org/packages/overtrue/wechat"><img src="https://poser.pugx.org/overtrue/wechat/v/unstable.svg" alt="Latest Unstable Version"></a>
-<a href="https://scrutinizer-ci.com/g/overtrue/wechat/build-status/master"><img src="https://scrutinizer-ci.com/g/overtrue/wechat/badges/build.png?b=master" alt="Build Status"></a>
-<a href="https://scrutinizer-ci.com/g/overtrue/wechat/?branch=master"><img src="https://scrutinizer-ci.com/g/overtrue/wechat/badges/quality-score.png?b=master" alt="Scrutinizer Code Quality"></a>
-<a href="https://scrutinizer-ci.com/g/overtrue/wechat/?branch=master"><img src="https://scrutinizer-ci.com/g/overtrue/wechat/badges/coverage.png?b=master" alt="Code Coverage"></a>
-<a href="https://packagist.org/packages/overtrue/wechat"><img src="https://poser.pugx.org/overtrue/wechat/downloads" alt="Total Downloads"></a>
-<a href="https://packagist.org/packages/overtrue/wechat"><img src="https://poser.pugx.org/overtrue/wechat/license" alt="License"></a>
-</p>
-
-</div>
-
-<p align="center">
-    <b>Special thanks to the generous sponsorship by:</b>
-    <br><br>
-    <a href="https://www.yousails.com">
-      <img src="https://yousails.com/banners/brand.png" width=350>
-    </a>
-    <br><br>
-    <a href="https://laravist.com">
-      <img width="160" src="https://o0dpls1ru.qnssl.com/laravist.com-logo.png">
-    </a>
-</p>
-
-<p align="center">
-<img width="400" src="http://wx1.sinaimg.cn/mw690/82b94fb4gy1fgwafq32r0j20nw0nwter.jpg">
-</p>
-
-<p align="center">关注我的公众号我们一起聊聊代码怎么样?</p>
-
-## Feature
-
- - 命名不那么乱七八糟;
- - 隐藏开发者不需要关注的细节;
- - 方法使用更优雅,不必再去研究那些奇怪的的方法名或者类名是做啥用的;
- - 自定义缓存方式;
- - 符合 [PSR](https://github.com/php-fig/fig-standards) 标准,你可以各种方便的与你的框架集成;
- - 高度抽象的消息类,免去各种拼json与xml的痛苦;
- - 详细 Debug 日志,一切交互都一目了然;
+<img align="right" width="100" src="https://user-images.githubusercontent.com/1472352/49656357-1e874080-fa78-11e8-80ea-69e2103345cf.png" alt="EasyWeChat Logo"/>
+
+<h1 align="left"><a href="https://www.easywechat.com">EasyWeChat</a></h1>
+
+📦 It is probably the best SDK in the world for developing Wechat App.
+
+[![Test Status](https://github.com/overtrue/wechat/workflows/Test/badge.svg)](https://github.com/overtrue/wechat/actions) 
+[![Lint Status](https://github.com/overtrue/wechat/workflows/Lint/badge.svg)](https://github.com/overtrue/wechat/actions) 
+[![Latest Stable Version](https://poser.pugx.org/overtrue/wechat/v/stable.svg)](https://packagist.org/packages/overtrue/wechat) 
+[![Latest Unstable Version](https://poser.pugx.org/overtrue/wechat/v/unstable.svg)](https://packagist.org/packages/overtrue/wechat)
+[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/overtrue/wechat/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/overtrue/wechat/?branch=master) 
+[![Code Coverage](https://scrutinizer-ci.com/g/overtrue/wechat/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/overtrue/wechat/?branch=master) 
+[![Total Downloads](https://poser.pugx.org/overtrue/wechat/downloads)](https://packagist.org/packages/overtrue/wechat) 
+[![License](https://poser.pugx.org/overtrue/wechat/license)](https://packagist.org/packages/overtrue/wechat) 
+
 
 ## Requirement
 
-1. PHP >= 5.5.9
-2. **[composer](https://getcomposer.org/)**
+1. PHP >= 7.1
+2. **[Composer](https://getcomposer.org/)**
 3. openssl 拓展
 4. fileinfo 拓展(素材管理模块需要用到)
 
-> SDK 对所使用的框架并无特别要求
-
 ## Installation
 
 ```shell
-composer require "overtrue/wechat:~3.1" -vvv
+$ composer require "overtrue/wechat:^4.2" -vvv
 ```
 
 ## Usage
@@ -68,12 +34,11 @@ composer require "overtrue/wechat:~3.1" -vvv
 ```php
 <?php
 
-use EasyWeChat\Foundation\Application;
+use EasyWeChat\Factory;
 
 $options = [
-    'debug'     => true,
-    'app_id'    => 'wx3cf0f39249eb0e60',
-    'secret'    => 'f1c242f4f28f735d4687abb469072a29',
+    'app_id'    => 'wx3cf0f39249eb0exxx',
+    'secret'    => 'f1c242f4f28f735d4687abb469072xxx',
     'token'     => 'easywechat',
     'log' => [
         'level' => 'debug',
@@ -82,13 +47,13 @@ $options = [
     // ...
 ];
 
-$app = new Application($options);
+$app = Factory::officialAccount($options);
 
 $server = $app->server;
 $user = $app->user;
 
-$server->setMessageHandler(function($message) use ($user) {
-    $fromUser = $user->get($message->FromUserName);
+$server->push(function($message) use ($user) {
+    $fromUser = $user->get($message['FromUserName']);
 
     return "{$fromUser->nickname} 您好!欢迎关注 overtrue!";
 });
@@ -96,25 +61,32 @@ $server->setMessageHandler(function($message) use ($user) {
 $server->serve()->send();
 ```
 
-更多请参考[http://easywechat.org/](http://easywechat.org/)。
+更多请参考 [https://www.easywechat.com/](https://www.easywechat.com/)。
 
 ## Documentation
 
-- Homepage: http://easywechat.org
-- Forum: https://forum.easywechat.org
-- 微信公众平台文档: https://mp.weixin.qq.com/wiki
-- WeChat Official Documentation: http://admin.wechat.com/wiki
-
-> 强烈建议看懂微信文档后再来使用本 SDK。
+[官网](https://www.easywechat.com)  · [教程](https://www.easywechat.com/tutorials)  ·  [讨论](https://yike.io/)  ·  [微信公众平台](https://mp.weixin.qq.com/wiki)  ·  [WeChat Official](http://admin.wechat.com/wiki)
 
 ## Integration
 
 [Laravel 5 拓展包: overtrue/laravel-wechat](https://github.com/overtrue/laravel-wechat)
 
-## Contribution
+## Contributors
+
+This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
+<a href="https://github.com/overtrue/wechat/graphs/contributors"><img src="https://opencollective.com/wechat/contributors.svg?width=890" /></a>
+
+
+## PHP 扩展包开发
+
+> 想知道如何从零开始构建 PHP 扩展包?
+>
+> 请关注我的实战课程,我会在此课程中分享一些扩展开发经验 —— [《PHP 扩展包实战教程 - 从入门到发布》](https://learnku.com/courses/creating-package)
 
-[Contribution Guide](.github/CONTRIBUTING.md)
 
 ## License
 
 MIT
+
+
+[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fovertrue%2Fwechat.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fovertrue%2Fwechat?ref=badge_large)
diff --git a/vendor/overtrue/wechat/composer.json b/vendor/overtrue/wechat/composer.json
index ea4abd1..e2547c6 100644
--- a/vendor/overtrue/wechat/composer.json
+++ b/vendor/overtrue/wechat/composer.json
@@ -15,32 +15,45 @@
         }
     ],
     "require": {
-        "php":">=5.5.0",
+        "php": ">=7.1",
+        "ext-fileinfo": "*",
         "ext-openssl": "*",
-        "pimple/pimple": "~3.0",
-        "monolog/monolog": "^1.17",
-        "overtrue/socialite": "^1.0.25",
-        "doctrine/cache": "1.4.*",
-        "guzzlehttp/guzzle": "~6.2",
-        "symfony/http-foundation": "~2.6|~2.7|~2.8|~3.0",
-        "symfony/psr-http-message-bridge": "~0.3|^1.0"
+        "ext-simplexml": "*",
+        "easywechat-composer/easywechat-composer": "^1.1",
+        "guzzlehttp/guzzle": "^6.2",
+        "monolog/monolog": "^1.22 || ^2.0",
+        "overtrue/socialite": "~2.0",
+        "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": {
-        "phpunit/phpunit": "~4.0",
-        "overtrue/phplint": "dev-master",
-        "mockery/mockery": "^0.9.9"
+        "friendsofphp/php-cs-fixer": "^2.15",
+        "mikey179/vfsstream": "^1.6",
+        "mockery/mockery": "^1.2.3",
+        "phpstan/phpstan": "^0.11.12",
+        "phpunit/phpunit": "^7.5"
     },
     "autoload": {
         "psr-4": {
             "EasyWeChat\\": "src/"
         },
         "files": [
-            "src/Payment/helpers.php"
+            "src/Kernel/Support/Helpers.php",
+            "src/Kernel/Helpers.php"
         ]
     },
     "autoload-dev": {
         "psr-4": {
             "EasyWeChat\\Tests\\": "tests/"
         }
+    },
+    "scripts": {
+        "phpcs": "vendor/bin/php-cs-fixer fix",
+        "phpstan": "vendor/bin/phpstan analyse",
+        "test": "vendor/bin/phpunit"
     }
 }
diff --git a/vendor/overtrue/wechat/src/Broadcast/Broadcast.php b/vendor/overtrue/wechat/src/Broadcast/Broadcast.php
deleted file mode 100644
index 79fd0fe..0000000
--- a/vendor/overtrue/wechat/src/Broadcast/Broadcast.php
+++ /dev/null
@@ -1,383 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Broadcast.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Broadcast;
-
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Core\Exceptions\HttpException;
-
-/**
- * Class Broadcast.
- */
-class Broadcast extends AbstractAPI
-{
-    const API_SEND_BY_GROUP = 'https://api.weixin.qq.com/cgi-bin/message/mass/sendall';
-    const API_SEND_BY_OPENID = 'https://api.weixin.qq.com/cgi-bin/message/mass/send';
-    const API_DELETE = 'https://api.weixin.qq.com/cgi-bin/message/mass/delete';
-    const API_PREVIEW = 'https://api.weixin.qq.com/cgi-bin/message/mass/preview';
-    const API_GET = 'https://api.weixin.qq.com/cgi-bin/message/mass/get';
-
-    const PREVIEW_BY_OPENID = 'touser';
-    const PREVIEW_BY_NAME = 'towxname';
-
-    const MSG_TYPE_TEXT = 'text'; // 文本
-    const MSG_TYPE_NEWS = 'news'; // 图文
-    const MSG_TYPE_VOICE = 'voice'; // 语音
-    const MSG_TYPE_IMAGE = 'image'; // 图片
-    const MSG_TYPE_VIDEO = 'video'; // 视频
-    const MSG_TYPE_CARD = 'card'; // 卡券
-
-    /**
-     * Send a message.
-     *
-     * @param string $msgType message type
-     * @param mixed  $message message
-     * @param mixed  $to
-     *
-     * @return mixed
-     */
-    public function send($msgType, $message, $to = null)
-    {
-        $message = (new MessageBuilder())->msgType($msgType)->message($message)->to($to)->build();
-
-        $api = is_array($to) ? self::API_SEND_BY_OPENID : self::API_SEND_BY_GROUP;
-
-        return $this->post($api, $message);
-    }
-
-    /**
-     * Send a text message.
-     *
-     * @param mixed $message message
-     * @param mixed $to
-     *
-     * @return mixed
-     */
-    public function sendText($message, $to = null)
-    {
-        return $this->send(self::MSG_TYPE_TEXT, $message, $to);
-    }
-
-    /**
-     * Send a news message.
-     *
-     * @param mixed $message message
-     * @param mixed $to
-     *
-     * @return mixed
-     */
-    public function sendNews($message, $to = null)
-    {
-        return $this->send(self::MSG_TYPE_NEWS, $message, $to);
-    }
-
-    /**
-     * Send a voice message.
-     *
-     * @param mixed $message message
-     * @param mixed $to
-     *
-     * @return mixed
-     */
-    public function sendVoice($message, $to = null)
-    {
-        return $this->send(self::MSG_TYPE_VOICE, $message, $to);
-    }
-
-    /**
-     * Send a image message.
-     *
-     * @param mixed $message message
-     * @param mixed $to
-     *
-     * @return mixed
-     */
-    public function sendImage($message, $to = null)
-    {
-        return $this->send(self::MSG_TYPE_IMAGE, $message, $to);
-    }
-
-    /**
-     * Send a video message.
-     *
-     * @param mixed $message message
-     * @param mixed $to
-     *
-     * @return mixed
-     */
-    public function sendVideo($message, $to = null)
-    {
-        return $this->send(self::MSG_TYPE_VIDEO, $message, $to);
-    }
-
-    /**
-     * Send a card message.
-     *
-     * @param mixed $message message
-     * @param mixed $to
-     *
-     * @return mixed
-     */
-    public function sendCard($message, $to = null)
-    {
-        return $this->send(self::MSG_TYPE_CARD, $message, $to);
-    }
-
-    /**
-     * Preview a message.
-     *
-     * @param string $msgType message type
-     * @param mixed  $message message
-     * @param string $to
-     * @param string $by
-     *
-     * @return mixed
-     */
-    public function preview($msgType, $message, $to, $by = self::PREVIEW_BY_OPENID)
-    {
-        $message = (new MessageBuilder())->msgType($msgType)->message($message)->to($to)->buildPreview($by);
-
-        return $this->post(self::API_PREVIEW, $message);
-    }
-
-    /**
-     * Preview a text message.
-     *
-     * @param mixed  $message message
-     * @param string $to
-     * @param string $by
-     *
-     * @return mixed
-     */
-    public function previewText($message, $to, $by = self::PREVIEW_BY_OPENID)
-    {
-        return $this->preview(self::MSG_TYPE_TEXT, $message, $to, $by);
-    }
-
-    /**
-     * Preview a news message.
-     *
-     * @param mixed  $message message
-     * @param string $to
-     * @param string $by
-     *
-     * @return mixed
-     */
-    public function previewNews($message, $to, $by = self::PREVIEW_BY_OPENID)
-    {
-        return $this->preview(self::MSG_TYPE_NEWS, $message, $to, $by);
-    }
-
-    /**
-     * Preview a voice message.
-     *
-     * @param mixed  $message message
-     * @param string $to
-     * @param string $by
-     *
-     * @return mixed
-     */
-    public function previewVoice($message, $to, $by = self::PREVIEW_BY_OPENID)
-    {
-        return $this->preview(self::MSG_TYPE_VOICE, $message, $to, $by);
-    }
-
-    /**
-     * Preview a image message.
-     *
-     * @param mixed  $message message
-     * @param string $to
-     * @param string $by
-     *
-     * @return mixed
-     */
-    public function previewImage($message, $to, $by = self::PREVIEW_BY_OPENID)
-    {
-        return $this->preview(self::MSG_TYPE_IMAGE, $message, $to, $by);
-    }
-
-    /**
-     * Preview a video message.
-     *
-     * @param mixed  $message message
-     * @param string $to
-     * @param string $by
-     *
-     * @return mixed
-     */
-    public function previewVideo($message, $to, $by = self::PREVIEW_BY_OPENID)
-    {
-        return $this->preview(self::MSG_TYPE_VIDEO, $message, $to, $by);
-    }
-
-    /**
-     * Preview a card message.
-     *
-     * @param mixed  $message message
-     * @param string $to
-     * @param string $by
-     *
-     * @return mixed
-     */
-    public function previewCard($message, $to, $by = self::PREVIEW_BY_OPENID)
-    {
-        return $this->preview(self::MSG_TYPE_CARD, $message, $to, $by);
-    }
-
-    /**
-     * Preview a message by name.
-     *
-     * @param string $msgType message type
-     * @param mixed  $message message
-     * @param $to
-     *
-     * @return mixed
-     */
-    public function previewByName($msgType, $message, $to)
-    {
-        return $this->preview($msgType, $message, $to, self::PREVIEW_BY_NAME);
-    }
-
-    /**
-     * Preview a text message by name.
-     *
-     * @param mixed $message message
-     * @param $to
-     *
-     * @return mixed
-     */
-    public function previewTextByName($message, $to)
-    {
-        return $this->preview(self::MSG_TYPE_TEXT, $message, $to, self::PREVIEW_BY_NAME);
-    }
-
-    /**
-     * Preview a news message by name.
-     *
-     * @param mixed $message message
-     * @param $to
-     *
-     * @return mixed
-     */
-    public function previewNewsByName($message, $to)
-    {
-        return $this->preview(self::MSG_TYPE_NEWS, $message, $to, self::PREVIEW_BY_NAME);
-    }
-
-    /**
-     * Preview a voice message by name.
-     *
-     * @param mixed $message message
-     * @param $to
-     *
-     * @return mixed
-     */
-    public function previewVoiceByName($message, $to)
-    {
-        return $this->preview(self::MSG_TYPE_VOICE, $message, $to, self::PREVIEW_BY_NAME);
-    }
-
-    /**
-     * Preview a image message by name.
-     *
-     * @param mixed $message message
-     * @param $to
-     *
-     * @return mixed
-     */
-    public function previewImageByName($message, $to)
-    {
-        return $this->preview(self::MSG_TYPE_IMAGE, $message, $to, self::PREVIEW_BY_NAME);
-    }
-
-    /**
-     * Preview a video message by name.
-     *
-     * @param mixed $message message
-     * @param $to
-     *
-     * @return mixed
-     */
-    public function previewVideoByName($message, $to)
-    {
-        return $this->preview(self::MSG_TYPE_VIDEO, $message, $to, self::PREVIEW_BY_NAME);
-    }
-
-    /**
-     * Preview a card message by name.
-     *
-     * @param mixed $message message
-     * @param $to
-     *
-     * @return mixed
-     */
-    public function previewCardByName($message, $to)
-    {
-        return $this->preview(self::MSG_TYPE_CARD, $message, $to, self::PREVIEW_BY_NAME);
-    }
-
-    /**
-     * Delete a broadcast.
-     *
-     * @param string $msgId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function delete($msgId)
-    {
-        $options = [
-            'msg_id' => $msgId,
-        ];
-
-        return $this->post(self::API_DELETE, $options);
-    }
-
-    /**
-     * Get a broadcast status.
-     *
-     * @param string $msgId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function status($msgId)
-    {
-        $options = [
-            'msg_id' => $msgId,
-        ];
-
-        return $this->post(self::API_GET, $options);
-    }
-
-    /**
-     * post request.
-     *
-     * @param string       $url
-     * @param array|string $options
-     *
-     * @return \EasyWeChat\Support\Collection
-     *
-     * @throws HttpException
-     */
-    private function post($url, $options)
-    {
-        return $this->parseJSON('json', [$url, $options]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Broadcast/LICENSE.txt b/vendor/overtrue/wechat/src/Broadcast/LICENSE.txt
deleted file mode 100644
index c5251b8..0000000
--- a/vendor/overtrue/wechat/src/Broadcast/LICENSE.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 overtrue <anzhengchao@gmail.com>
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Broadcast/MessageBuilder.php b/vendor/overtrue/wechat/src/Broadcast/MessageBuilder.php
deleted file mode 100644
index 4a37c5d..0000000
--- a/vendor/overtrue/wechat/src/Broadcast/MessageBuilder.php
+++ /dev/null
@@ -1,258 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * MessageBuilder.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Broadcast;
-
-use EasyWeChat\Core\Exceptions\InvalidArgumentException;
-use EasyWeChat\Core\Exceptions\RuntimeException;
-
-/**
- * Class MessageBuilder.
- */
-class MessageBuilder
-{
-    /**
-     * Message target user or group.
-     *
-     * @var mixed
-     */
-    protected $to;
-
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $msgType;
-
-    /**
-     * Message.
-     *
-     * @var mixed
-     */
-    protected $message;
-
-    /**
-     * Message types.
-     *
-     * @var array
-     */
-    private $msgTypes = [
-        Broadcast::MSG_TYPE_TEXT,
-        Broadcast::MSG_TYPE_NEWS,
-        Broadcast::MSG_TYPE_IMAGE,
-        Broadcast::MSG_TYPE_VIDEO,
-        Broadcast::MSG_TYPE_VOICE,
-        Broadcast::MSG_TYPE_CARD,
-    ];
-
-    /**
-     * Preview bys.
-     *
-     * @var array
-     */
-    private $previewBys = [
-        Broadcast::PREVIEW_BY_OPENID,
-        Broadcast::PREVIEW_BY_NAME,
-    ];
-
-    /**
-     * Set message type.
-     *
-     * @param string $msgType
-     *
-     * @return MessageBuilder
-     *
-     * @throws InvalidArgumentException
-     */
-    public function msgType($msgType)
-    {
-        if (!in_array($msgType, $this->msgTypes, true)) {
-            throw new InvalidArgumentException('This message type not exist.');
-        }
-
-        $this->msgType = $msgType;
-
-        return $this;
-    }
-
-    /**
-     * Set message.
-     *
-     * @param string|array $message
-     *
-     * @return MessageBuilder
-     */
-    public function message($message)
-    {
-        $this->message = $message;
-
-        return $this;
-    }
-
-    /**
-     * Set target user or group.
-     *
-     * @param mixed $to
-     *
-     * @return MessageBuilder
-     */
-    public function to($to)
-    {
-        $this->to = $to;
-
-        return $this;
-    }
-
-    /**
-     * Build message.
-     *
-     * @return bool
-     *
-     * @throws RuntimeException
-     */
-    public function build()
-    {
-        if (empty($this->msgType)) {
-            throw new RuntimeException('message type not exist.');
-        }
-
-        if (empty($this->message)) {
-            throw new RuntimeException('No message content to send.');
-        }
-
-        // 群发视频消息给用户列表时,视频消息格式需要另外处理,具体见文档
-        if (Broadcast::MSG_TYPE_VIDEO === $this->msgType) {
-            if (is_array($this->message)) {
-                $this->message = array_shift($this->message);
-            }
-            $this->msgType = 'mpvideo';
-        }
-
-        $content = (new Transformer($this->msgType, $this->message))->transform();
-
-        $group = isset($this->to) ? $this->to : null;
-
-        $message = array_merge($this->buildGroup($group), $content);
-
-        return $message;
-    }
-
-    /**
-     * Build preview message.
-     *
-     * @param string $by
-     *
-     * @return array
-     *
-     * @throws RuntimeException
-     * @throws InvalidArgumentException
-     */
-    public function buildPreview($by)
-    {
-        if (!in_array($by, $this->previewBys, true)) {
-            throw new InvalidArgumentException('This preview by not exist.');
-        }
-
-        if (empty($this->msgType)) {
-            throw new RuntimeException('Message type not exist.');
-        } elseif (Broadcast::MSG_TYPE_VIDEO === $this->msgType) {
-            if (is_array($this->message)) {
-                $this->message = array_shift($this->message);
-            }
-            $this->msgType = 'mpvideo';
-        }
-
-        if (empty($this->message)) {
-            throw new RuntimeException('No message content to send.');
-        }
-
-        if (empty($this->to)) {
-            throw new RuntimeException('No to.');
-        }
-
-        $content = (new Transformer($this->msgType, $this->message))->transform();
-
-        $message = array_merge($this->buildTo($this->to, $by), $content);
-
-        return $message;
-    }
-
-    /**
-     * Build group.
-     *
-     * @param mixed $group
-     *
-     * @return array
-     */
-    private function buildGroup($group)
-    {
-        if (is_null($group)) {
-            $group = [
-                'filter' => [
-                    'is_to_all' => true,
-                ],
-            ];
-        } elseif (is_array($group)) {
-            $group = [
-                'touser' => $group,
-            ];
-        } else {
-            $group = [
-                'filter' => [
-                    'is_to_all' => false,
-                    'group_id' => $group,
-                ],
-            ];
-        }
-
-        return $group;
-    }
-
-    /**
-     * Build to.
-     *
-     * @param string $to
-     * @param string $by
-     *
-     * @return array
-     */
-    private function buildTo($to, $by)
-    {
-        return [
-            $by => $to,
-        ];
-    }
-
-    /**
-     * Return property.
-     *
-     * @param string $property
-     *
-     * @return mixed
-     */
-    public function __get($property)
-    {
-        if (property_exists($this, $property)) {
-            return $this->$property;
-        }
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Broadcast/README.md b/vendor/overtrue/wechat/src/Broadcast/README.md
deleted file mode 100644
index a68f405..0000000
--- a/vendor/overtrue/wechat/src/Broadcast/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# broadcast
-微信 SDK 群发模块
diff --git a/vendor/overtrue/wechat/src/Broadcast/Transformer.php b/vendor/overtrue/wechat/src/Broadcast/Transformer.php
deleted file mode 100644
index 5b00913..0000000
--- a/vendor/overtrue/wechat/src/Broadcast/Transformer.php
+++ /dev/null
@@ -1,196 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Transformer.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Broadcast;
-
-use EasyWeChat\Core\Exceptions\InvalidArgumentException;
-
-/**
- * Class Transformer.
- */
-class Transformer
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $msgType;
-
-    /**
-     * message.
-     *
-     * @var mixed
-     */
-    protected $message;
-
-    /**
-     * Transformer constructor.
-     *
-     * @param $msgType
-     * @param $message
-     */
-    public function __construct($msgType, $message)
-    {
-        $this->msgType = $msgType;
-
-        $this->message = $message;
-    }
-
-    /**
-     * Transform message.
-     *
-     * @return array
-     */
-    public function transform()
-    {
-        $handle = sprintf('transform%s', ucfirst($this->msgType));
-
-        return method_exists($this, $handle) ? $this->$handle($this->message) : [];
-    }
-
-    /**
-     * Transform text message.
-     *
-     * @param string $message
-     *
-     * @return array
-     */
-    public function transformText($message)
-    {
-        return [
-            'text' => [
-                'content' => $message,
-            ],
-            'msgtype' => 'text',
-        ];
-    }
-
-    /**
-     * Transform news message.
-     *
-     * @param string $message
-     *
-     * @return array
-     */
-    public function transformNews($message)
-    {
-        return [
-            'mpnews' => [
-                'media_id' => $message,
-            ],
-            'msgtype' => 'mpnews',
-        ];
-    }
-
-    /**
-     * Transform image message.
-     *
-     * @param string $message
-     *
-     * @return array
-     */
-    public function transformImage($message)
-    {
-        return [
-            'image' => [
-                'media_id' => $message,
-            ],
-            'msgtype' => 'image',
-        ];
-    }
-
-    /**
-     * Transform video message.
-     *
-     * @param array $message
-     *
-     * @return array
-     *
-     * @throws InvalidArgumentException
-     */
-    public function transformVideo(array $message)
-    {
-        if (3 !== count($message)) {
-            throw new InvalidArgumentException('send message to openids, the message must be three arguments.');
-        }
-
-        return [
-            'mpvideo' => [
-                'media_id' => $message[0],
-                'title' => $message[1],
-                'description' => $message[2],
-            ],
-            'msgtype' => 'mpvideo',
-        ];
-    }
-
-    /**
-     * Transform mpvideo message.
-     *
-     * @param string $message
-     *
-     * @return array
-     */
-    public function transformMpvideo($message)
-    {
-        return [
-            'mpvideo' => [
-                'media_id' => $message,
-            ],
-            'msgtype' => 'mpvideo',
-        ];
-    }
-
-    /**
-     * Transform voice message.
-     *
-     * @param string $message
-     *
-     * @return array
-     */
-    public function transformVoice($message)
-    {
-        return [
-            'voice' => [
-                'media_id' => $message,
-            ],
-            'msgtype' => 'voice',
-        ];
-    }
-
-    /**
-     * Transform card message.
-     *
-     * @param $message
-     *
-     * @return array
-     */
-    public function transformCard($message)
-    {
-        return [
-            'wxcard' => [
-                'card_id' => $message,
-            ],
-            'msgtype' => 'wxcard',
-        ];
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Broadcast/composer.json b/vendor/overtrue/wechat/src/Broadcast/composer.json
deleted file mode 100644
index 0de0381..0000000
--- a/vendor/overtrue/wechat/src/Broadcast/composer.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-    "name": "easywechat/broadcast",
-    "description": "broadcast module for EasyWeChat SDK.",
-    "keywords": [
-        "wechat",
-        "weixin",
-        "SDK",
-        "broadcast",
-        "easywechat"
-    ],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Broadcast\\": "."
-        }
-    },
-    "minimum-stability": "dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core": "dev-master",
-        "easywechat/message": "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Card/Card.php b/vendor/overtrue/wechat/src/Card/Card.php
deleted file mode 100644
index cc4dc9a..0000000
--- a/vendor/overtrue/wechat/src/Card/Card.php
+++ /dev/null
@@ -1,891 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Card.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2016 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Card;
-
-use Doctrine\Common\Cache\Cache;
-use Doctrine\Common\Cache\FilesystemCache;
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Support\Arr;
-use Psr\Http\Message\ResponseInterface;
-
-class Card extends AbstractAPI
-{
-    /**
-     * Cache.
-     *
-     * @var Cache
-     */
-    protected $cache;
-
-    /**
-     * Ticket cache key.
-     *
-     * @var string
-     */
-    protected $ticketCacheKey;
-
-    /**
-     * Ticket cache prefix.
-     *
-     * @var string
-     */
-    protected $ticketCachePrefix = 'overtrue.wechat.card_api_ticket.';
-
-    const API_GET_COLORS = 'https://api.weixin.qq.com/card/getcolors';
-    const API_CREATE_CARD = 'https://api.weixin.qq.com/card/create';
-    const API_CREATE_QRCODE = 'https://api.weixin.qq.com/card/qrcode/create';
-    const API_SHOW_QRCODE = 'https://mp.weixin.qq.com/cgi-bin/showqrcode';
-    const API_GET_CARD_TICKET = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket';
-    const API_CREATE_LANDING_PAGE = 'https://api.weixin.qq.com/card/landingpage/create';
-    const API_DEPOSIT_CODE = 'https://api.weixin.qq.com/card/code/deposit';
-    const API_GET_DEPOSIT_COUNT = 'https://api.weixin.qq.com/card/code/getdepositcount';
-    const API_CHECK_CODE = 'https://api.weixin.qq.com/card/code/checkcode';
-    const API_GET_HTML = 'https://api.weixin.qq.com/card/mpnews/gethtml';
-    const API_SET_TEST_WHITE_LIST = 'https://api.weixin.qq.com/card/testwhitelist/set';
-    const API_GET_CODE = 'https://api.weixin.qq.com/card/code/get';
-    const API_CONSUME_CARD = 'https://api.weixin.qq.com/card/code/consume';
-    const API_DECRYPT_CODE = 'https://api.weixin.qq.com/card/code/decrypt';
-    const API_GET_CARD_LIST = 'https://api.weixin.qq.com/card/user/getcardlist';
-    const API_GET_CARD = 'https://api.weixin.qq.com/card/get';
-    const API_LIST_CARD = 'https://api.weixin.qq.com/card/batchget';
-    const API_UPDATE_CARD = 'https://api.weixin.qq.com/card/update';
-    const API_SET_PAY_CELL = 'https://api.weixin.qq.com/card/paycell/set';
-    const API_MODIFY_STOCK = 'https://api.weixin.qq.com/card/modifystock';
-    const API_UPDATE_CODE = 'https://api.weixin.qq.com/card/code/update';
-    const API_DELETE_CARD = 'https://api.weixin.qq.com/card/delete';
-    const API_DISABLE_CARD = 'https://api.weixin.qq.com/card/code/unavailable';
-    const API_ACTIVATE_MEMBER_CARD = 'https://api.weixin.qq.com/card/membercard/activate';
-    const API_ACTIVATE_MEMBER_USER_FORM = 'https://api.weixin.qq.com/card/membercard/activateuserform/set';
-    const API_GET_MEMBER_USER_INFO = 'https://api.weixin.qq.com/card/membercard/userinfo/get';
-    const API_UPDATE_MEMBER_CARD_USER = 'https://api.weixin.qq.com/card/membercard/updateuser';
-    const API_CREATE_SUB_MERCHANT = 'https://api.weixin.qq.com/card/submerchant/submit';
-    const API_UPDATE_SUB_MERCHANT = 'https://api.weixin.qq.com/card/submerchant/update';
-    const API_GET_SUB_MERCHANT = 'https://api.weixin.qq.com/card/submerchant/get';
-    const API_LIST_SUB_MERCHANT = 'https://api.weixin.qq.com/card/submerchant/batchget';
-    const API_GET_CATEGORIES = 'https://api.weixin.qq.com/card/getapplyprotocol';
-    const API_ACTIVATE_GENERAL_CARD = 'https://api.weixin.qq.com/card/generalcard/activate';
-    const API_UPDATE_GENERAL_CARD_USER = 'https://api.weixin.qq.com/card/generalcard/updateuser';
-
-    /**
-     * 获取卡券颜色.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getColors()
-    {
-        return $this->parseJSON('get', [self::API_GET_COLORS]);
-    }
-
-    /**
-     * 创建卡券.
-     *
-     * @param string $cardType
-     * @param array  $baseInfo
-     * @param array  $especial
-     * @param array  $advancedInfo
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function create($cardType = 'member_card', array $baseInfo = [], array $especial = [], array $advancedInfo = [])
-    {
-        $params = [
-            'card' => [
-                'card_type' => strtoupper($cardType),
-                strtolower($cardType) => array_merge(['base_info' => $baseInfo], $especial, ['advanced_info' => $advancedInfo]),
-            ],
-        ];
-
-        return $this->parseJSON('json', [self::API_CREATE_CARD, $params]);
-    }
-
-    /**
-     * 创建二维码.
-     *
-     * @param array $cards
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function QRCode(array $cards = [])
-    {
-        return $this->parseJSON('json', [self::API_CREATE_QRCODE, $cards]);
-    }
-
-    /**
-     * ticket 换取二维码图片.
-     *
-     * @param string $ticket
-     *
-     * @return array
-     */
-    public function showQRCode($ticket = null)
-    {
-        $params = [
-            'ticket' => $ticket,
-        ];
-
-        $http = $this->getHttp();
-
-        /** @var ResponseInterface $response */
-        $response = $http->get(self::API_SHOW_QRCODE, $params);
-
-        return [
-            'status' => $response->getStatusCode(),
-            'reason' => $response->getReasonPhrase(),
-            'headers' => $response->getHeaders(),
-            'body' => strval($response->getBody()),
-            'url' => self::API_SHOW_QRCODE.'?'.http_build_query($params),
-        ];
-    }
-
-    /**
-     * 通过ticket换取二维码 链接.
-     *
-     * @param string $ticket
-     *
-     * @return string
-     */
-    public function getQRCodeUrl($ticket)
-    {
-        return self::API_SHOW_QRCODE.'?ticket='.$ticket;
-    }
-
-    /**
-     * 获取 卡券 Api_ticket.
-     *
-     * @param bool $refresh 是否强制刷新
-     *
-     * @return string $apiTicket
-     */
-    public function getAPITicket($refresh = false)
-    {
-        $key = $this->getTicketCacheKey();
-
-        $ticket = $this->getCache()->fetch($key);
-
-        if (!$ticket || $refresh) {
-            $result = $this->parseJSON('get', [self::API_GET_CARD_TICKET, ['type' => 'wx_card']]);
-
-            $this->getCache()->save($key, $result['ticket'], $result['expires_in'] - 500);
-
-            return $result['ticket'];
-        }
-
-        return $ticket;
-    }
-
-    /**
-     * 微信卡券:JSAPI 卡券发放.
-     *
-     * @param array $cards
-     *
-     * @return string
-     */
-    public function jsConfigForAssign(array $cards)
-    {
-        return json_encode(array_map(function ($card) {
-            return $this->attachExtension($card['card_id'], $card);
-        }, $cards));
-    }
-
-    /**
-     * 生成 js添加到卡包 需要的 card_list 项.
-     *
-     * @param string $cardId
-     * @param array  $extension
-     *
-     * @return string
-     */
-    public function attachExtension($cardId, array $extension = [])
-    {
-        $timestamp = time();
-        $ext = [
-            'code' => Arr::get($extension, 'code'),
-            'openid' => Arr::get($extension, 'openid', Arr::get($extension, 'open_id')),
-            'timestamp' => $timestamp,
-            'outer_id' => Arr::get($extension, 'outer_id'),
-            'balance' => Arr::get($extension, 'balance'),
-            'fixed_begintimestamp' => Arr::get($extension, 'fixed_begintimestamp'),
-            'outer_str' => Arr::get($extension, 'outer_str'),
-        ];
-        $ext['signature'] = $this->getSignature(
-            $this->getAPITicket(),
-            $timestamp,
-            $cardId,
-            $ext['code'],
-            $ext['openid'],
-            $ext['balance']
-        );
-
-        return [
-            'cardId' => $cardId,
-            'cardExt' => json_encode($ext),
-        ];
-    }
-
-    /**
-     * 生成签名.
-     *
-     * @return string
-     */
-    public function getSignature()
-    {
-        $params = func_get_args();
-        sort($params, SORT_STRING);
-
-        return sha1(implode($params));
-    }
-
-    /**
-     * 创建货架接口.
-     *
-     * @param string $banner
-     * @param string $pageTitle
-     * @param bool   $canShare
-     * @param string $scene     [SCENE_NEAR_BY 附近,SCENE_MENU 自定义菜单,SCENE_QRCODE 二维码,SCENE_ARTICLE 公众号文章,
-     *                          SCENE_H5 h5页面,SCENE_IVR 自动回复,SCENE_CARD_CUSTOM_CELL 卡券自定义cell]
-     * @param array  $cardList
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function createLandingPage($banner, $pageTitle, $canShare, $scene, $cardList)
-    {
-        $params = [
-            'banner' => $banner,
-            'page_title' => $pageTitle,
-            'can_share' => $canShare,
-            'scene' => $scene,
-            'card_list' => $cardList,
-        ];
-
-        return $this->parseJSON('json', [self::API_CREATE_LANDING_PAGE, $params]);
-    }
-
-    /**
-     * 导入code接口.
-     *
-     * @param string $cardId
-     * @param array  $code
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function deposit($cardId, $code)
-    {
-        $params = [
-            'card_id' => $cardId,
-            'code' => $code,
-        ];
-
-        return $this->parseJSON('json', [self::API_DEPOSIT_CODE, $params]);
-    }
-
-    /**
-     * 查询导入code数目.
-     *
-     * @param string $cardId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getDepositedCount($cardId)
-    {
-        $params = [
-            'card_id' => $cardId,
-        ];
-
-        return $this->parseJSON('json', [self::API_GET_DEPOSIT_COUNT, $params]);
-    }
-
-    /**
-     * 核查code接口.
-     *
-     * @param string $cardId
-     * @param array  $code
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function checkCode($cardId, $code)
-    {
-        $params = [
-            'card_id' => $cardId,
-            'code' => $code,
-        ];
-
-        return $this->parseJSON('json', [self::API_CHECK_CODE, $params]);
-    }
-
-    /**
-     * 查询Code接口.
-     *
-     * @param string $code
-     * @param bool   $checkConsume
-     * @param string $cardId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getCode($code, $checkConsume, $cardId)
-    {
-        $params = [
-            'code' => $code,
-            'check_consume' => $checkConsume,
-            'card_id' => $cardId,
-        ];
-
-        return $this->parseJSON('json', [self::API_GET_CODE, $params]);
-    }
-
-    /**
-     * 核销Code接口.
-     *
-     * @param string $code
-     * @param string $cardId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function consume($code, $cardId = null)
-    {
-        if (28 === strlen($code) && $cardId && 28 !== strlen($cardId)) {
-            list($code, $cardId) = [$cardId, $code];
-        }
-
-        $params = [
-            'code' => $code,
-        ];
-
-        if ($cardId) {
-            $params['card_id'] = $cardId;
-        }
-
-        return $this->parseJSON('json', [self::API_CONSUME_CARD, $params]);
-    }
-
-    /**
-     * Code解码接口.
-     *
-     * @param string $encryptedCode
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function decryptCode($encryptedCode)
-    {
-        $params = [
-            'encrypt_code' => $encryptedCode,
-        ];
-
-        return $this->parseJSON('json', [self::API_DECRYPT_CODE, $params]);
-    }
-
-    /**
-     * 图文消息群发卡券.
-     *
-     * @param string $cardId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getHtml($cardId)
-    {
-        $params = [
-            'card_id' => $cardId,
-        ];
-
-        return $this->parseJSON('json', [self::API_GET_HTML, $params]);
-    }
-
-    /**
-     * 设置测试白名单.
-     *
-     * @param array $openids
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function setTestWhitelist($openids)
-    {
-        $params = [
-            'openid' => $openids,
-        ];
-
-        return $this->parseJSON('json', [self::API_SET_TEST_WHITE_LIST, $params]);
-    }
-
-    /**
-     * 设置测试白名单(by username).
-     *
-     * @param array $usernames
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function setTestWhitelistByUsername($usernames)
-    {
-        $params = [
-            'username' => $usernames,
-        ];
-
-        return $this->parseJSON('json', [self::API_SET_TEST_WHITE_LIST, $params]);
-    }
-
-    /**
-     * 获取用户已领取卡券接口.
-     *
-     * @param string $openid
-     * @param string $cardId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getUserCards($openid, $cardId = '')
-    {
-        $params = [
-            'openid' => $openid,
-            'card_id' => $cardId,
-        ];
-
-        return $this->parseJSON('json', [self::API_GET_CARD_LIST, $params]);
-    }
-
-    /**
-     * 查看卡券详情.
-     *
-     * @param string $cardId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getCard($cardId)
-    {
-        $params = [
-            'card_id' => $cardId,
-        ];
-
-        return $this->parseJSON('json', [self::API_GET_CARD, $params]);
-    }
-
-    /**
-     * 批量查询卡列表.
-     *
-     * @param int    $offset
-     * @param int    $count
-     * @param string $statusList
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function lists($offset = 0, $count = 10, $statusList = 'CARD_STATUS_VERIFY_OK')
-    {
-        $params = [
-            'offset' => $offset,
-            'count' => $count,
-            'status_list' => $statusList,
-        ];
-
-        return $this->parseJSON('json', [self::API_LIST_CARD, $params]);
-    }
-
-    /**
-     * 更改卡券信息接口 and 设置跟随推荐接口.
-     *
-     * @param string $cardId
-     * @param string $type
-     * @param array  $baseInfo
-     * @param array  $especial
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function update($cardId, $type, $baseInfo = [], $especial = [])
-    {
-        $card = [];
-        $card['card_id'] = $cardId;
-        $card[$type] = [];
-
-        $cardInfo = [];
-        if ($baseInfo) {
-            $cardInfo['base_info'] = $baseInfo;
-        }
-
-        $card[$type] = array_merge($cardInfo, $especial);
-
-        return $this->parseJSON('json', [self::API_UPDATE_CARD, $card]);
-    }
-
-    /**
-     * 设置微信买单接口.
-     * 设置买单的 card_id 必须已经配置了门店,否则会报错.
-     *
-     * @param string $cardId
-     * @param bool   $isOpen
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function setPayCell($cardId, $isOpen = true)
-    {
-        $params = [
-            'card_id' => $cardId,
-            'is_open' => $isOpen,
-        ];
-
-        return $this->parseJSON('json', [self::API_SET_PAY_CELL, $params]);
-    }
-
-    /**
-     * 增加库存.
-     *
-     * @param string $cardId
-     * @param int    $amount
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function increaseStock($cardId, $amount)
-    {
-        return $this->updateStock($cardId, $amount, 'increase');
-    }
-
-    /**
-     * 减少库存.
-     *
-     * @param string $cardId
-     * @param int    $amount
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function reduceStock($cardId, $amount)
-    {
-        return $this->updateStock($cardId, $amount, 'reduce');
-    }
-
-    /**
-     * 修改库存接口.
-     *
-     * @param string $cardId
-     * @param int    $amount
-     * @param string $action
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    protected function updateStock($cardId, $amount, $action = 'increase')
-    {
-        $key = 'increase' === $action ? 'increase_stock_value' : 'reduce_stock_value';
-        $params = [
-            'card_id' => $cardId,
-            $key => abs($amount),
-        ];
-
-        return $this->parseJSON('json', [self::API_MODIFY_STOCK, $params]);
-    }
-
-    /**
-     * 更改Code接口.
-     *
-     * @param string $code
-     * @param string $newCode
-     * @param array  $cardId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function updateCode($code, $newCode, $cardId = [])
-    {
-        $params = [
-            'code' => $code,
-            'new_code' => $newCode,
-            'card_id' => $cardId,
-        ];
-
-        return $this->parseJSON('json', [self::API_UPDATE_CODE, $params]);
-    }
-
-    /**
-     * 删除卡券接口.
-     *
-     * @param string $cardId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function delete($cardId)
-    {
-        $params = [
-            'card_id' => $cardId,
-        ];
-
-        return $this->parseJSON('json', [self::API_DELETE_CARD, $params]);
-    }
-
-    /**
-     * 设置卡券失效.
-     *
-     * @param string $code
-     * @param string $cardId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function disable($code, $cardId = '')
-    {
-        $params = [
-            'code' => $code,
-            'card_id' => $cardId,
-        ];
-
-        return $this->parseJSON('json', [self::API_DISABLE_CARD, $params]);
-    }
-
-    /**
-     * 会员卡接口激活.
-     *
-     * @param array $info
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function activate($info = [], $cardType = 'member_card')
-    {
-        if ('general_card' === $cardType) {
-            return $this->parseJSON('json', [self::API_ACTIVATE_GENERAL_CARD, $info]);
-        }
-
-        return $this->parseJSON('json', [self::API_ACTIVATE_MEMBER_CARD, $info]);
-    }
-
-    /**
-     * 设置开卡字段接口.
-     *
-     * @param string $cardId
-     * @param array  $requiredForm
-     * @param array  $optionalForm
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function activateUserForm($cardId, array $requiredForm = [], array $optionalForm = [])
-    {
-        $params = array_merge(['card_id' => $cardId], $requiredForm, $optionalForm);
-
-        return $this->parseJSON('json', [self::API_ACTIVATE_MEMBER_USER_FORM, $params]);
-    }
-
-    /**
-     * 拉取会员信息接口.
-     *
-     * @param string $cardId
-     * @param string $code
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getMemberCardUser($cardId, $code)
-    {
-        $params = [
-            'card_id' => $cardId,
-            'code' => $code,
-        ];
-
-        return $this->parseJSON('json', [self::API_GET_MEMBER_USER_INFO, $params]);
-    }
-
-    /**
-     * 更新会员信息.
-     *
-     * @param array $params
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function updateMemberCardUser(array $params = [])
-    {
-        return $this->parseJSON('json', [self::API_UPDATE_MEMBER_CARD_USER, $params]);
-    }
-
-    /**
-     * 更新通用员信息.
-     *
-     * @param array $params
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function updateGeneralCardUser(array $params = [])
-    {
-        return $this->parseJSON('json', [self::API_UPDATE_GENERAL_CARD_USER, $params]);
-    }
-
-    /**
-     * 添加子商户.
-     *
-     * @param array $info
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function createSubMerchant(array $info = [])
-    {
-        $params = [
-            'info' => Arr::only($info, [
-                'brand_name',
-                'logo_url',
-                'protocol',
-                'end_time',
-                'primary_category_id',
-                'secondary_category_id',
-                'agreement_media_id',
-                'operator_media_id',
-                'app_id',
-            ]),
-        ];
-
-        return $this->parseJSON('json', [self::API_CREATE_SUB_MERCHANT, $params]);
-    }
-
-    /**
-     * 更新子商户.
-     *
-     * @param int   $merchantId
-     * @param array $info
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function updateSubMerchant($merchantId, array $info = [])
-    {
-        $params = [
-            'info' => array_merge(['merchant_id' => $merchantId],
-                Arr::only($info, [
-                    'brand_name',
-                    'logo_url',
-                    'protocol',
-                    'end_time',
-                    'primary_category_id',
-                    'secondary_category_id',
-                    'agreement_media_id',
-                    'operator_media_id',
-                    'app_id',
-                ])),
-        ];
-
-        return $this->parseJSON('json', [self::API_UPDATE_SUB_MERCHANT, $params]);
-    }
-
-    /**
-     * 获取子商户信息.
-     *
-     * @param int $merchantId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getSubMerchant($merchantId)
-    {
-        return $this->parseJSON('json', [self::API_GET_SUB_MERCHANT, ['merchant_id' => $merchantId]]);
-    }
-
-    /**
-     * 批量获取子商户信息.
-     *
-     * @param int    $beginId
-     * @param int    $limit
-     * @param string $status
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function listSubMerchants($beginId = 0, $limit = 50, $status = 'CHECKING')
-    {
-        $params = [
-            'begin_id' => $beginId,
-            'limit' => $limit,
-            'status' => $status,
-        ];
-
-        return $this->parseJSON('json', [self::API_LIST_SUB_MERCHANT, $params]);
-    }
-
-    /**
-     * 卡券开放类目查询接口.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getCategories()
-    {
-        return $this->parseJSON('get', [self::API_GET_CATEGORIES]);
-    }
-
-    /**
-     * Set cache manager.
-     *
-     * @param \Doctrine\Common\Cache\Cache $cache
-     *
-     * @return $this
-     */
-    public function setCache(Cache $cache)
-    {
-        $this->cache = $cache;
-
-        return $this;
-    }
-
-    /**
-     * Return cache manager.
-     *
-     * @return \Doctrine\Common\Cache\Cache
-     */
-    public function getCache()
-    {
-        return $this->cache ?: $this->cache = new FilesystemCache(sys_get_temp_dir());
-    }
-
-    /**
-     * Set Api_ticket cache prifix.
-     *
-     * @param string $prefix
-     *
-     * @return $this
-     */
-    public function setTicketCachePrefix($prefix)
-    {
-        $this->ticketCachePrefix = $prefix;
-
-        return $this;
-    }
-
-    /**
-     * Set Api_ticket cache key.
-     *
-     * @param string $cacheKey
-     *
-     * @return $this
-     */
-    public function setTicketCacheKey($cacheKey)
-    {
-        $this->ticketCacheKey = $cacheKey;
-
-        return $this;
-    }
-
-    /**
-     * Get ApiTicket token cache key.
-     *
-     * @return string
-     */
-    public function getTicketCacheKey()
-    {
-        if (is_null($this->ticketCacheKey)) {
-            return $this->ticketCachePrefix.$this->getAccessToken()->getAppId();
-        }
-
-        return $this->ticketCacheKey;
-    }
-
-    /**
-     * Set current url.
-     *
-     * @param string $url
-     *
-     * @return Card
-     */
-    public function setUrl($url)
-    {
-        $this->url = $url;
-
-        return $this;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Card/LICENSE b/vendor/overtrue/wechat/src/Card/LICENSE
deleted file mode 100644
index c5251b8..0000000
--- a/vendor/overtrue/wechat/src/Card/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 overtrue <anzhengchao@gmail.com>
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Card/README.md b/vendor/overtrue/wechat/src/Card/README.md
deleted file mode 100644
index 6a8a1a5..0000000
--- a/vendor/overtrue/wechat/src/Card/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# card
-微信卡券
diff --git a/vendor/overtrue/wechat/src/Card/composer.json b/vendor/overtrue/wechat/src/Card/composer.json
deleted file mode 100644
index 8bac543..0000000
--- a/vendor/overtrue/wechat/src/Card/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/card",
-    "description": "card module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "card", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "wangniuniu",
-            "email": "1098484600@qq.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Card\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Comment/Comment.php b/vendor/overtrue/wechat/src/Comment/Comment.php
deleted file mode 100644
index e08d5d0..0000000
--- a/vendor/overtrue/wechat/src/Comment/Comment.php
+++ /dev/null
@@ -1,203 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Comment.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2017
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Comment;
-
-use EasyWeChat\Core\AbstractAPI;
-
-class Comment extends AbstractAPI
-{
-    const API_OPEN_COMMENT = 'https://api.weixin.qq.com/cgi-bin/comment/open';
-    const API_CLOSE_COMMENT = 'https://api.weixin.qq.com/cgi-bin/comment/close';
-    const API_LIST_COMMENT = 'https://api.weixin.qq.com/cgi-bin/comment/list';
-    const API_MARK_ELECT = 'https://api.weixin.qq.com/cgi-bin/comment/markelect';
-    const API_UNMARK_ELECT = 'https://api.weixin.qq.com/cgi-bin/comment/unmarkelect';
-    const API_DELETE_COMMENT = 'https://api.weixin.qq.com/cgi-bin/comment/delete';
-    const API_REPLY_COMMENT = 'https://api.weixin.qq.com/cgi-bin/comment/reply/add';
-    const API_DELETE_REPLY = 'https://api.weixin.qq.com/cgi-bin/comment/reply/delete';
-
-    /**
-     * Open article comment.
-     *
-     * @param string $msgId
-     * @param int    $index
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function open($msgId, $index)
-    {
-        $params = [
-            'msg_data_id' => $msgId,
-            'index' => $index,
-        ];
-
-        return $this->parseJSON('json', [self::API_OPEN_COMMENT, $params]);
-    }
-
-    /**
-     * Close comment.
-     *
-     * @param string $msgId
-     * @param int    $index
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function close($msgId, $index)
-    {
-        $params = [
-            'msg_data_id' => $msgId,
-            'index' => $index,
-        ];
-
-        return $this->parseJSON('json', [self::API_CLOSE_COMMENT, $params]);
-    }
-
-    /**
-     * Get article comments.
-     *
-     * @param string $msgId
-     * @param int    $index
-     * @param int    $begin
-     * @param int    $count
-     * @param int    $type
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function lists($msgId, $index, $begin, $count, $type = 0)
-    {
-        $params = [
-            'msg_data_id' => $msgId,
-            'index' => $index,
-            'begin' => $begin,
-            'count' => $count,
-            'type' => $type,
-        ];
-
-        return $this->parseJSON('json', [self::API_LIST_COMMENT, $params]);
-    }
-
-    /**
-     * Mark elect comment.
-     *
-     * @param string $msgId
-     * @param int    $index
-     * @param int    $commentId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function markElect($msgId, $index, $commentId)
-    {
-        $params = [
-            'msg_data_id' => $msgId,
-            'index' => $index,
-            'user_comment_id' => $commentId,
-        ];
-
-        return $this->parseJSON('json', [self::API_MARK_ELECT, $params]);
-    }
-
-    /**
-     * Unmark elect comment.
-     *
-     * @param string $msgId
-     * @param int    $index
-     * @param int    $commentId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function unmarkElect($msgId, $index, $commentId)
-    {
-        $params = [
-            'msg_data_id' => $msgId,
-            'index' => $index,
-            'user_comment_id' => $commentId,
-        ];
-
-        return $this->parseJSON('json', [self::API_UNMARK_ELECT, $params]);
-    }
-
-    /**
-     * Delete comment.
-     *
-     * @param string $msgId
-     * @param int    $index
-     * @param int    $commentId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function delete($msgId, $index, $commentId)
-    {
-        $params = [
-            'msg_data_id' => $msgId,
-            'index' => $index,
-            'user_comment_id' => $commentId,
-        ];
-
-        return $this->parseJSON('json', [self::API_DELETE_COMMENT, $params]);
-    }
-
-    /**
-     * Reply to a comment.
-     *
-     * @param string $msgId
-     * @param int    $index
-     * @param int    $commentId
-     * @param string $content
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function reply($msgId, $index, $commentId, $content)
-    {
-        $params = [
-            'msg_data_id' => $msgId,
-            'index' => $index,
-            'user_comment_id' => $commentId,
-            'content' => $content,
-        ];
-
-        return $this->parseJSON('json', [self::API_REPLY_COMMENT, $params]);
-    }
-
-    /**
-     * Delete a reply.
-     *
-     * @param string $msgId
-     * @param int    $index
-     * @param int    $commentId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function deleteReply($msgId, $index, $commentId)
-    {
-        $params = [
-            'msg_data_id' => $msgId,
-            'index' => $index,
-            'user_comment_id' => $commentId,
-        ];
-
-        return $this->parseJSON('json', [self::API_DELETE_REPLY, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Core/AbstractAPI.php b/vendor/overtrue/wechat/src/Core/AbstractAPI.php
deleted file mode 100644
index 0bf3d26..0000000
--- a/vendor/overtrue/wechat/src/Core/AbstractAPI.php
+++ /dev/null
@@ -1,258 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * AbstractAPI.php.
- *
- * This file is part of the wechat-components.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Core;
-
-use EasyWeChat\Core\Exceptions\HttpException;
-use EasyWeChat\Support\Collection;
-use EasyWeChat\Support\Log;
-use GuzzleHttp\Middleware;
-use GuzzleHttp\Psr7\Uri;
-use Psr\Http\Message\RequestInterface;
-use Psr\Http\Message\ResponseInterface;
-
-/**
- * Class AbstractAPI.
- */
-abstract class AbstractAPI
-{
-    /**
-     * Http instance.
-     *
-     * @var \EasyWeChat\Core\Http
-     */
-    protected $http;
-
-    /**
-     * The request token.
-     *
-     * @var \EasyWeChat\Core\AccessToken
-     */
-    protected $accessToken;
-
-    const GET = 'get';
-    const POST = 'post';
-    const JSON = 'json';
-
-    /**
-     * @var int
-     */
-    protected static $maxRetries = 2;
-
-    /**
-     * Constructor.
-     *
-     * @param \EasyWeChat\Core\AccessToken $accessToken
-     */
-    public function __construct(AccessToken $accessToken)
-    {
-        $this->setAccessToken($accessToken);
-    }
-
-    /**
-     * Return the http instance.
-     *
-     * @return \EasyWeChat\Core\Http
-     */
-    public function getHttp()
-    {
-        if (is_null($this->http)) {
-            $this->http = new Http();
-        }
-
-        if (0 === count($this->http->getMiddlewares())) {
-            $this->registerHttpMiddlewares();
-        }
-
-        return $this->http;
-    }
-
-    /**
-     * Set the http instance.
-     *
-     * @param \EasyWeChat\Core\Http $http
-     *
-     * @return $this
-     */
-    public function setHttp(Http $http)
-    {
-        $this->http = $http;
-
-        return $this;
-    }
-
-    /**
-     * Return the current accessToken.
-     *
-     * @return \EasyWeChat\Core\AccessToken
-     */
-    public function getAccessToken()
-    {
-        return $this->accessToken;
-    }
-
-    /**
-     * Set the request token.
-     *
-     * @param \EasyWeChat\Core\AccessToken $accessToken
-     *
-     * @return $this
-     */
-    public function setAccessToken(AccessToken $accessToken)
-    {
-        $this->accessToken = $accessToken;
-
-        return $this;
-    }
-
-    /**
-     * @param int $retries
-     */
-    public static function maxRetries($retries)
-    {
-        self::$maxRetries = abs($retries);
-    }
-
-    /**
-     * Parse JSON from response and check error.
-     *
-     * @param string $method
-     * @param array  $args
-     *
-     * @return \EasyWeChat\Support\Collection | null
-     *
-     * @throws \EasyWeChat\Core\Exceptions\HttpException
-     */
-    public function parseJSON($method, array $args)
-    {
-        $http = $this->getHttp();
-
-        $contents = $http->parseJSON(call_user_func_array([$http, $method], $args));
-
-        if (empty($contents)) {
-            return null;
-        }
-
-        $this->checkAndThrow($contents);
-
-        return new Collection($contents);
-    }
-
-    /**
-     * Register Guzzle middlewares.
-     */
-    protected function registerHttpMiddlewares()
-    {
-        // log
-        $this->http->addMiddleware($this->logMiddleware());
-        // retry
-        $this->http->addMiddleware($this->retryMiddleware());
-        // access token
-        $this->http->addMiddleware($this->accessTokenMiddleware());
-    }
-
-    /**
-     * Attache access token to request query.
-     *
-     * @return \Closure
-     */
-    protected function accessTokenMiddleware()
-    {
-        return function (callable $handler) {
-            return function (RequestInterface $request, array $options) use ($handler) {
-                if (!$this->accessToken) {
-                    return $handler($request, $options);
-                }
-
-                $field = $this->accessToken->getQueryName();
-                $token = $this->accessToken->getToken();
-
-                $request = $request->withUri(Uri::withQueryValue($request->getUri(), $field, $token));
-
-                return $handler($request, $options);
-            };
-        };
-    }
-
-    /**
-     * Log the request.
-     *
-     * @return \Closure
-     */
-    protected function logMiddleware()
-    {
-        return Middleware::tap(function (RequestInterface $request, $options) {
-            Log::debug("Request: {$request->getMethod()} {$request->getUri()} ".json_encode($options));
-            Log::debug('Request headers:'.json_encode($request->getHeaders()));
-        });
-    }
-
-    /**
-     * Return retry middleware.
-     *
-     * @return \Closure
-     */
-    protected function retryMiddleware()
-    {
-        return Middleware::retry(function (
-                                          $retries,
-                                          RequestInterface $request,
-                                          ResponseInterface $response = null
-                                       ) {
-            // Limit the number of retries to 2
-            if ($retries <= self::$maxRetries && $response && $body = $response->getBody()) {
-                // Retry on server errors
-                if (false !== stripos($body, 'errcode') && (false !== stripos($body, '40001') || false !== stripos($body, '42001'))) {
-                    $field = $this->accessToken->getQueryName();
-                    $token = $this->accessToken->getToken(true);
-
-                    $request = $request->withUri($newUri = Uri::withQueryValue($request->getUri(), $field, $token));
-
-                    Log::debug("Retry with Request Token: {$token}");
-                    Log::debug("Retry with Request Uri: {$newUri}");
-
-                    return true;
-                }
-            }
-
-            return false;
-        });
-    }
-
-    /**
-     * Check the array data errors, and Throw exception when the contents contains error.
-     *
-     * @param array $contents
-     *
-     * @throws \EasyWeChat\Core\Exceptions\HttpException
-     */
-    protected function checkAndThrow(array $contents)
-    {
-        if (isset($contents['errcode']) && 0 !== $contents['errcode']) {
-            if (empty($contents['errmsg'])) {
-                $contents['errmsg'] = 'Unknown';
-            }
-
-            throw new HttpException($contents['errmsg'], $contents['errcode']);
-        }
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Core/AccessToken.php b/vendor/overtrue/wechat/src/Core/AccessToken.php
deleted file mode 100644
index da406d2..0000000
--- a/vendor/overtrue/wechat/src/Core/AccessToken.php
+++ /dev/null
@@ -1,314 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * AccessToken.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Core;
-
-use Doctrine\Common\Cache\Cache;
-use Doctrine\Common\Cache\FilesystemCache;
-use EasyWeChat\Core\Exceptions\HttpException;
-
-/**
- * Class AccessToken.
- */
-class AccessToken
-{
-    /**
-     * App ID.
-     *
-     * @var string
-     */
-    protected $appId;
-
-    /**
-     * App secret.
-     *
-     * @var string
-     */
-    protected $secret;
-
-    /**
-     * Cache.
-     *
-     * @var Cache
-     */
-    protected $cache;
-
-    /**
-     * Cache Key.
-     *
-     * @var string
-     */
-    protected $cacheKey;
-
-    /**
-     * Http instance.
-     *
-     * @var Http
-     */
-    protected $http;
-
-    /**
-     * Query name.
-     *
-     * @var string
-     */
-    protected $queryName = 'access_token';
-
-    /**
-     * Response Json key name.
-     *
-     * @var string
-     */
-    protected $tokenJsonKey = 'access_token';
-
-    /**
-     * Cache key prefix.
-     *
-     * @var string
-     */
-    protected $prefix = 'easywechat.common.access_token.';
-
-    // API
-    const API_TOKEN_GET = 'https://api.weixin.qq.com/cgi-bin/token';
-
-    /**
-     * Constructor.
-     *
-     * @param string                       $appId
-     * @param string                       $secret
-     * @param \Doctrine\Common\Cache\Cache $cache
-     */
-    public function __construct($appId, $secret, Cache $cache = null)
-    {
-        $this->appId = $appId;
-        $this->secret = $secret;
-        $this->cache = $cache;
-    }
-
-    /**
-     * Get token from WeChat API.
-     *
-     * @param bool $forceRefresh
-     *
-     * @return string
-     */
-    public function getToken($forceRefresh = false)
-    {
-        $cacheKey = $this->getCacheKey();
-        $cached = $this->getCache()->fetch($cacheKey);
-
-        if ($forceRefresh || empty($cached)) {
-            $token = $this->getTokenFromServer();
-
-            // XXX: T_T... 7200 - 1500
-            $this->getCache()->save($cacheKey, $token[$this->tokenJsonKey], $token['expires_in'] - 1500);
-
-            return $token[$this->tokenJsonKey];
-        }
-
-        return $cached;
-    }
-
-    /**
-     * 设置自定义 token.
-     *
-     * @param string $token
-     * @param int    $expires
-     *
-     * @return $this
-     */
-    public function setToken($token, $expires = 7200)
-    {
-        $this->getCache()->save($this->getCacheKey(), $token, $expires - 1500);
-
-        return $this;
-    }
-
-    /**
-     * Return the app id.
-     *
-     * @return string
-     */
-    public function getAppId()
-    {
-        return $this->appId;
-    }
-
-    /**
-     * Return the secret.
-     *
-     * @return string
-     */
-    public function getSecret()
-    {
-        return $this->secret;
-    }
-
-    /**
-     * Set cache instance.
-     *
-     * @param \Doctrine\Common\Cache\Cache $cache
-     *
-     * @return AccessToken
-     */
-    public function setCache(Cache $cache)
-    {
-        $this->cache = $cache;
-
-        return $this;
-    }
-
-    /**
-     * Return the cache manager.
-     *
-     * @return \Doctrine\Common\Cache\Cache
-     */
-    public function getCache()
-    {
-        return $this->cache ?: $this->cache = new FilesystemCache(sys_get_temp_dir());
-    }
-
-    /**
-     * Set the query name.
-     *
-     * @param string $queryName
-     *
-     * @return $this
-     */
-    public function setQueryName($queryName)
-    {
-        $this->queryName = $queryName;
-
-        return $this;
-    }
-
-    /**
-     * Return the query name.
-     *
-     * @return string
-     */
-    public function getQueryName()
-    {
-        return $this->queryName;
-    }
-
-    /**
-     * Return the API request queries.
-     *
-     * @return array
-     */
-    public function getQueryFields()
-    {
-        return [$this->queryName => $this->getToken()];
-    }
-
-    /**
-     * Get the access token from WeChat server.
-     *
-     * @throws \EasyWeChat\Core\Exceptions\HttpException
-     *
-     * @return string
-     */
-    public function getTokenFromServer()
-    {
-        $params = [
-            'appid' => $this->appId,
-            'secret' => $this->secret,
-            'grant_type' => 'client_credential',
-        ];
-
-        $http = $this->getHttp();
-
-        $token = $http->parseJSON($http->get(self::API_TOKEN_GET, $params));
-
-        if (empty($token[$this->tokenJsonKey])) {
-            throw new HttpException('Request AccessToken fail. response: '.json_encode($token, JSON_UNESCAPED_UNICODE));
-        }
-
-        return $token;
-    }
-
-    /**
-     * Return the http instance.
-     *
-     * @return \EasyWeChat\Core\Http
-     */
-    public function getHttp()
-    {
-        return $this->http ?: $this->http = new Http();
-    }
-
-    /**
-     * Set the http instance.
-     *
-     * @param \EasyWeChat\Core\Http $http
-     *
-     * @return $this
-     */
-    public function setHttp(Http $http)
-    {
-        $this->http = $http;
-
-        return $this;
-    }
-
-    /**
-     * Set the access token prefix.
-     *
-     * @param string $prefix
-     *
-     * @return $this
-     */
-    public function setPrefix($prefix)
-    {
-        $this->prefix = $prefix;
-
-        return $this;
-    }
-
-    /**
-     * Set access token cache key.
-     *
-     * @param string $cacheKey
-     *
-     * @return $this
-     */
-    public function setCacheKey($cacheKey)
-    {
-        $this->cacheKey = $cacheKey;
-
-        return $this;
-    }
-
-    /**
-     * Get access token cache key.
-     *
-     * @return string $this->cacheKey
-     */
-    public function getCacheKey()
-    {
-        if (is_null($this->cacheKey)) {
-            return $this->prefix.$this->appId;
-        }
-
-        return $this->cacheKey;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Core/Exception.php b/vendor/overtrue/wechat/src/Core/Exception.php
deleted file mode 100644
index 8b34d2d..0000000
--- a/vendor/overtrue/wechat/src/Core/Exception.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Exception.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Core;
-
-use Exception as BaseException;
-
-/**
- * Class Exception.
- */
-class Exception extends BaseException
-{
-}
diff --git a/vendor/overtrue/wechat/src/Core/Exceptions/FaultException.php b/vendor/overtrue/wechat/src/Core/Exceptions/FaultException.php
deleted file mode 100644
index ddd9deb..0000000
--- a/vendor/overtrue/wechat/src/Core/Exceptions/FaultException.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * FaultException.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Core\Exceptions;
-
-use EasyWeChat\Core\Exception;
-
-/**
- * Class FaultException.
- */
-class FaultException extends Exception
-{
-}
diff --git a/vendor/overtrue/wechat/src/Core/Exceptions/HttpException.php b/vendor/overtrue/wechat/src/Core/Exceptions/HttpException.php
deleted file mode 100644
index 8f42137..0000000
--- a/vendor/overtrue/wechat/src/Core/Exceptions/HttpException.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * HttpException.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Core\Exceptions;
-
-use EasyWeChat\Core\Exception;
-
-/**
- * Class HttpException.
- */
-class HttpException extends Exception
-{
-}
diff --git a/vendor/overtrue/wechat/src/Core/Exceptions/InvalidArgumentException.php b/vendor/overtrue/wechat/src/Core/Exceptions/InvalidArgumentException.php
deleted file mode 100644
index 4193ddf..0000000
--- a/vendor/overtrue/wechat/src/Core/Exceptions/InvalidArgumentException.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * InvalidArgumentException.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Core\Exceptions;
-
-use EasyWeChat\Core\Exception;
-
-/**
- * Class InvalidArgumentException.
- */
-class InvalidArgumentException extends Exception
-{
-}
diff --git a/vendor/overtrue/wechat/src/Core/Exceptions/InvalidConfigException.php b/vendor/overtrue/wechat/src/Core/Exceptions/InvalidConfigException.php
deleted file mode 100644
index b3b436c..0000000
--- a/vendor/overtrue/wechat/src/Core/Exceptions/InvalidConfigException.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * InvalidConfigException.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Core\Exceptions;
-
-use EasyWeChat\Core\Exception;
-
-/**
- * Class InvalidConfigException.
- */
-class InvalidConfigException extends Exception
-{
-}
diff --git a/vendor/overtrue/wechat/src/Core/Exceptions/RuntimeException.php b/vendor/overtrue/wechat/src/Core/Exceptions/RuntimeException.php
deleted file mode 100644
index b4db4ae..0000000
--- a/vendor/overtrue/wechat/src/Core/Exceptions/RuntimeException.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * RuntimeException.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Core\Exceptions;
-
-use EasyWeChat\Core\Exception;
-
-/**
- * Class RuntimeException.
- */
-class RuntimeException extends Exception
-{
-}
diff --git a/vendor/overtrue/wechat/src/Core/Exceptions/UnboundServiceException.php b/vendor/overtrue/wechat/src/Core/Exceptions/UnboundServiceException.php
deleted file mode 100644
index 608dfac..0000000
--- a/vendor/overtrue/wechat/src/Core/Exceptions/UnboundServiceException.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * UnBoundServiceException.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Core\Exceptions;
-
-use EasyWeChat\Core\Exception;
-
-/**
- * Class InvalidConfigException.
- */
-class UnboundServiceException extends Exception
-{
-}
diff --git a/vendor/overtrue/wechat/src/Core/Http.php b/vendor/overtrue/wechat/src/Core/Http.php
deleted file mode 100644
index 0ec5b7b..0000000
--- a/vendor/overtrue/wechat/src/Core/Http.php
+++ /dev/null
@@ -1,319 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Http.php.
- *
- * This file is part of the wechat-components.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Core;
-
-use EasyWeChat\Core\Exceptions\HttpException;
-use EasyWeChat\Support\Log;
-use GuzzleHttp\Client as HttpClient;
-use GuzzleHttp\HandlerStack;
-use Psr\Http\Message\ResponseInterface;
-
-/**
- * Class Http.
- */
-class Http
-{
-    /**
-     * Used to identify handler defined by client code
-     * Maybe useful in the future.
-     */
-    const USER_DEFINED_HANDLER = 'userDefined';
-
-    /**
-     * Http client.
-     *
-     * @var HttpClient
-     */
-    protected $client;
-
-    /**
-     * The middlewares.
-     *
-     * @var array
-     */
-    protected $middlewares = [];
-
-    /**
-     * @var array
-     */
-    protected static $globals = [
-        'curl' => [
-            CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
-        ],
-    ];
-
-    /**
-     * Guzzle client default settings.
-     *
-     * @var array
-     */
-    protected static $defaults = [];
-
-    /**
-     * Set guzzle default settings.
-     *
-     * @param array $defaults
-     */
-    public static function setDefaultOptions($defaults = [])
-    {
-        self::$defaults = array_merge(self::$globals, $defaults);
-    }
-
-    /**
-     * Return current guzzle default settings.
-     *
-     * @return array
-     */
-    public static function getDefaultOptions()
-    {
-        return self::$defaults;
-    }
-
-    /**
-     * GET request.
-     *
-     * @param string $url
-     * @param array  $options
-     *
-     * @return ResponseInterface
-     *
-     * @throws HttpException
-     */
-    public function get($url, array $options = [])
-    {
-        return $this->request($url, 'GET', ['query' => $options]);
-    }
-
-    /**
-     * POST request.
-     *
-     * @param string       $url
-     * @param array|string $options
-     *
-     * @return ResponseInterface
-     *
-     * @throws HttpException
-     */
-    public function post($url, $options = [])
-    {
-        $key = is_array($options) ? 'form_params' : 'body';
-
-        return $this->request($url, 'POST', [$key => $options]);
-    }
-
-    /**
-     * JSON request.
-     *
-     * @param string       $url
-     * @param string|array $options
-     * @param array        $queries
-     * @param int          $encodeOption
-     *
-     * @return ResponseInterface
-     *
-     * @throws HttpException
-     */
-    public function json($url, $options = [], $encodeOption = JSON_UNESCAPED_UNICODE, $queries = [])
-    {
-        is_array($options) && $options = json_encode($options, $encodeOption);
-
-        return $this->request($url, 'POST', ['query' => $queries, 'body' => $options, 'headers' => ['content-type' => 'application/json']]);
-    }
-
-    /**
-     * Upload file.
-     *
-     * @param string $url
-     * @param array  $files
-     * @param array  $form
-     *
-     * @return ResponseInterface
-     *
-     * @throws HttpException
-     */
-    public function upload($url, array $files = [], array $form = [], array $queries = [])
-    {
-        $multipart = [];
-
-        foreach ($files as $name => $path) {
-            $multipart[] = [
-                'name' => $name,
-                'contents' => fopen($path, 'r'),
-            ];
-        }
-
-        foreach ($form as $name => $contents) {
-            $multipart[] = compact('name', 'contents');
-        }
-
-        return $this->request($url, 'POST', ['query' => $queries, 'multipart' => $multipart]);
-    }
-
-    /**
-     * Set GuzzleHttp\Client.
-     *
-     * @param \GuzzleHttp\Client $client
-     *
-     * @return Http
-     */
-    public function setClient(HttpClient $client)
-    {
-        $this->client = $client;
-
-        return $this;
-    }
-
-    /**
-     * Return GuzzleHttp\Client instance.
-     *
-     * @return \GuzzleHttp\Client
-     */
-    public function getClient()
-    {
-        if (!($this->client instanceof HttpClient)) {
-            $this->client = new HttpClient();
-        }
-
-        return $this->client;
-    }
-
-    /**
-     * Add a middleware.
-     *
-     * @param callable $middleware
-     *
-     * @return $this
-     */
-    public function addMiddleware(callable $middleware)
-    {
-        array_push($this->middlewares, $middleware);
-
-        return $this;
-    }
-
-    /**
-     * Return all middlewares.
-     *
-     * @return array
-     */
-    public function getMiddlewares()
-    {
-        return $this->middlewares;
-    }
-
-    /**
-     * Make a request.
-     *
-     * @param string $url
-     * @param string $method
-     * @param array  $options
-     *
-     * @return ResponseInterface
-     *
-     * @throws HttpException
-     */
-    public function request($url, $method = 'GET', $options = [])
-    {
-        $method = strtoupper($method);
-
-        $options = array_merge(self::$defaults, $options);
-
-        Log::debug('Client Request:', compact('url', 'method', 'options'));
-
-        $options['handler'] = $this->getHandler();
-
-        $response = $this->getClient()->request($method, $url, $options);
-
-        Log::debug('API response:', [
-            'Status' => $response->getStatusCode(),
-            'Reason' => $response->getReasonPhrase(),
-            'Headers' => $response->getHeaders(),
-            'Body' => strval($response->getBody()),
-        ]);
-
-        return $response;
-    }
-
-    /**
-     * @param \Psr\Http\Message\ResponseInterface|string $body
-     *
-     * @return mixed
-     *
-     * @throws \EasyWeChat\Core\Exceptions\HttpException
-     */
-    public function parseJSON($body)
-    {
-        if ($body instanceof ResponseInterface) {
-            $body = mb_convert_encoding($body->getBody(), 'UTF-8');
-        }
-
-        // XXX: json maybe contains special chars. So, let's FUCK the WeChat API developers ...
-        $body = $this->fuckTheWeChatInvalidJSON($body);
-
-        if (empty($body)) {
-            return false;
-        }
-
-        $contents = json_decode($body, true, 512, JSON_BIGINT_AS_STRING);
-
-        Log::debug('API response decoded:', compact('contents'));
-
-        if (JSON_ERROR_NONE !== json_last_error()) {
-            throw new HttpException('Failed to parse JSON: '.json_last_error_msg());
-        }
-
-        return $contents;
-    }
-
-    /**
-     * Filter the invalid JSON string.
-     *
-     * @param \Psr\Http\Message\StreamInterface|string $invalidJSON
-     *
-     * @return string
-     */
-    protected function fuckTheWeChatInvalidJSON($invalidJSON)
-    {
-        return preg_replace('/[\x00-\x1F\x80-\x9F]/u', '', trim($invalidJSON));
-    }
-
-    /**
-     * Build a handler.
-     *
-     * @return HandlerStack
-     */
-    protected function getHandler()
-    {
-        $stack = HandlerStack::create();
-
-        foreach ($this->middlewares as $middleware) {
-            $stack->push($middleware);
-        }
-
-        if (isset(static::$defaults['handler']) && is_callable(static::$defaults['handler'])) {
-            $stack->push(static::$defaults['handler'], self::USER_DEFINED_HANDLER);
-        }
-
-        return $stack;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Core/LICENSE b/vendor/overtrue/wechat/src/Core/LICENSE
deleted file mode 100644
index c5251b8..0000000
--- a/vendor/overtrue/wechat/src/Core/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 overtrue <anzhengchao@gmail.com>
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Core/README.md b/vendor/overtrue/wechat/src/Core/README.md
deleted file mode 100644
index 78da7fa..0000000
--- a/vendor/overtrue/wechat/src/Core/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# core
-微信 SDK 核心部分
diff --git a/vendor/overtrue/wechat/src/Core/composer.json b/vendor/overtrue/wechat/src/Core/composer.json
deleted file mode 100644
index 3d4d016..0000000
--- a/vendor/overtrue/wechat/src/Core/composer.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-    "name": "easywechat/core",
-    "description": "core module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Core\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "~4.0",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "php":">=5.5.0",
-        "doctrine/cache": "~1.4",
-        "easywechat/support" : "dev-master",
-        "guzzlehttp/guzzle": "~6.1"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Device/Device.php b/vendor/overtrue/wechat/src/Device/Device.php
deleted file mode 100644
index 4ae7a8c..0000000
--- a/vendor/overtrue/wechat/src/Device/Device.php
+++ /dev/null
@@ -1,216 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Device.php.
- *
- * @author    soone <66812590@qq.com>
- * @copyright 2016 soone <66812590@qq.com>
- */
-
-namespace EasyWeChat\Device;
-
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Core\AccessToken;
-
-/**
- * Class Device.
- */
-class Device extends AbstractAPI
-{
-    protected $deviceType;
-
-    protected $productId;
-
-    protected $config;
-
-    const API_TRANS_MSG = 'https://api.weixin.qq.com/device/transmsg';
-    const API_CREATE = 'https://api.weixin.qq.com/device/create_qrcode';
-    const API_DEV_STAT = 'https://api.weixin.qq.com/device/get_stat';
-    const API_DEV_AUTH = 'https://api.weixin.qq.com/device/authorize_device';
-    const API_DEV_GET_QRCODE = 'https://api.weixin.qq.com/device/getqrcode';
-    const API_DEV_VERIFY_QRCODE = 'https://api.weixin.qq.com/device/verify_qrcode';
-    const API_DEV_BIND = 'https://api.weixin.qq.com/device/bind';
-    const API_DEV_UNBIND = 'https://api.weixin.qq.com/device/unbind';
-    const API_DEV_COMPEL_BIND = 'https://api.weixin.qq.com/device/compel_bind';
-    const API_DEV_COMPEL_UNBIND = 'https://api.weixin.qq.com/device/compel_unbind';
-    const API_DEV_GET_OPENID = 'https://api.weixin.qq.com/device/get_openid';
-    const API_USER_DEV_BIND = 'https://api.weixin.qq.com/device/get_bind_device';
-
-    public function __construct(AccessToken $accessToken, $config)
-    {
-        parent::setAccessToken($accessToken);
-        $this->config = $config;
-        $this->deviceType = $this->config['device_type'];
-        $this->productId = $this->config['product_id'];
-    }
-
-    public function setProductId($productId)
-    {
-        $this->productId = $productId;
-
-        return $this;
-    }
-
-    /**
-     * Send message to device.
-     *
-     * @param int $sceneValue
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function sendToDevice($deviceId, $openId, $content)
-    {
-        $params = [
-            'device_type' => $this->deviceType,
-            'device_id' => $deviceId,
-            'open_id' => $openId,
-            'content' => base64_decode($content, true),
-        ];
-
-        return $this->parseJSON('json', [self::API_TRANS_MSG, $params]);
-    }
-
-    public function getDeviceQrcode(array $deviceIds)
-    {
-        $params = [
-            'device_num' => count($deviceIds),
-            'device_id_list' => $deviceIds,
-        ];
-
-        return $this->parseJSON('json', [self::API_CREATE, $params]);
-    }
-
-    public function authorizeDevice(array $deviceInfos, $opType = 0)
-    {
-        $params = [
-            'device_num' => count($deviceInfos),
-            'device_list' => $this->getDeviceList($deviceInfos),
-            'op_type' => $opType,
-            'product_id' => $this->productId,
-        ];
-
-        return $this->parseJSON('json', [self::API_DEV_AUTH, $params]);
-    }
-
-    protected function getDeviceList($deviceInfos)
-    {
-        $res = [];
-        foreach ($deviceInfos as $dInfo) {
-            $data = [
-                'id' => $dInfo['deviceId'],
-                'mac' => $dInfo['mac'],
-                'connect_protocol' => $this->config['connect_protocol'],
-                'auth_key' => $this->config['auth_key'],
-                'close_strategy' => $this->config['close_strategy'],
-                'conn_strategy' => $this->config['conn_strategy'],
-                'crypt_method' => $this->config['crypt_method'],
-                'auth_ver' => $this->config['auth_ver'],
-                'manu_mac_pos' => $this->config['manu_mac_pos'],
-                'ser_mac_pos' => $this->config['ser_mac_pos'],
-            ];
-
-            !empty($this->config['ble_simple_protocol']) ? $data['ble_simple_protocol'] = $this->config['ble_simple_protocol'] : '';
-
-            $res[] = $data;
-        }
-
-        return $res;
-    }
-
-    public function createDeviceId()
-    {
-        $params = [
-            'product_id' => $this->productId,
-        ];
-
-        return $this->parseJSON('get', [self::API_DEV_GET_QRCODE, $params]);
-    }
-
-    public function bind($openId, $deviceId, $ticket)
-    {
-        $params = [
-            'ticket' => $ticket,
-            'device_id' => $deviceId,
-            'openid' => $openId,
-        ];
-
-        return $this->parseJSON('json', [self::API_DEV_BIND, $params]);
-    }
-
-    public function unbind($openId, $deviceId, $ticket)
-    {
-        $params = [
-            'ticket' => $ticket,
-            'device_id' => $deviceId,
-            'openid' => $openId,
-        ];
-
-        return $this->parseJSON('json', [self::API_DEV_UNBIND, $params]);
-    }
-
-    public function compelBind($openId, $deviceId)
-    {
-        $params = [
-            'device_id' => $deviceId,
-            'openid' => $openId,
-        ];
-
-        return $this->parseJSON('json', [self::API_DEV_COMPEL_BIND, $params]);
-    }
-
-    public function compelUnbind($openId, $deviceId)
-    {
-        $params = [
-            'device_id' => $deviceId,
-            'openid' => $openId,
-        ];
-
-        return $this->parseJSON('json', [self::API_DEV_COMPEL_UNBIND, $params]);
-    }
-
-    public function getDeviceStatus($deviceId)
-    {
-        $params = [
-            'device_id' => $deviceId,
-        ];
-
-        return $this->parseJSON('get', [self::API_DEV_STAT, $params]);
-    }
-
-    public function verifyQrcode($ticket)
-    {
-        $params = [
-            'ticket' => $ticket,
-        ];
-
-        return $this->parseJSON('post', [self::API_DEV_VERIFY_QRCODE, $params]);
-    }
-
-    public function getOpenid($deviceId)
-    {
-        $params = [
-            'device_type' => $this->deviceType,
-            'device_id' => $deviceId,
-        ];
-
-        return $this->parseJSON('get', [self::API_DEV_GET_OPENID, $params]);
-    }
-
-    public function getDeviceidByOpenid($openid)
-    {
-        $params = [
-            'openid' => $openid,
-        ];
-
-        return $this->parseJSON('get', [self::API_USER_DEV_BIND, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Device/DeviceHttpException.php b/vendor/overtrue/wechat/src/Device/DeviceHttpException.php
deleted file mode 100644
index 9f1b553..0000000
--- a/vendor/overtrue/wechat/src/Device/DeviceHttpException.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * DeviceHttpException.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Device;
-
-use EasyWeChat\Core\Exception as CoreException;
-
-/**
- * Class DeviceHttpException.
- */
-class DeviceHttpException extends CoreException
-{
-}
diff --git a/vendor/overtrue/wechat/src/Device/LICENSE b/vendor/overtrue/wechat/src/Device/LICENSE
deleted file mode 100644
index c5251b8..0000000
--- a/vendor/overtrue/wechat/src/Device/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 overtrue <anzhengchao@gmail.com>
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Device/README.md b/vendor/overtrue/wechat/src/Device/README.md
deleted file mode 100644
index 10b8538..0000000
--- a/vendor/overtrue/wechat/src/Device/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# device
-微信 SDK 设备管理模块
diff --git a/vendor/overtrue/wechat/src/Device/composer.json b/vendor/overtrue/wechat/src/Device/composer.json
deleted file mode 100644
index f2f3913..0000000
--- a/vendor/overtrue/wechat/src/Device/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/device",
-    "description": "device module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "device", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Device\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Encryption/EncryptionException.php b/vendor/overtrue/wechat/src/Encryption/EncryptionException.php
deleted file mode 100644
index 22c47ab..0000000
--- a/vendor/overtrue/wechat/src/Encryption/EncryptionException.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * EncryptionException.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Encryption;
-
-use EasyWeChat\Core\Exception as CoreException;
-
-/**
- * Class EncryptionException.
- */
-class EncryptionException extends CoreException
-{
-    const ERROR_INVALID_SIGNATURE = -40001; // Signature verification failed
-    const ERROR_PARSE_XML = -40002; // Parse XML failed
-    const ERROR_CALC_SIGNATURE = -40003; // Calculating the signature failed
-    const ERROR_INVALID_AESKEY = -40004; // Invalid AESKey
-    const ERROR_INVALID_APPID = -40005; // Check AppID failed
-    const ERROR_ENCRYPT_AES = -40006; // AES Encryption failed
-    const ERROR_DECRYPT_AES = -40007; // AES decryption failed
-    const ERROR_INVALID_XML = -40008; // Invalid XML
-    const ERROR_BASE64_ENCODE = -40009; // Base64 encoding failed
-    const ERROR_BASE64_DECODE = -40010; // Base64 decoding failed
-    const ERROR_XML_BUILD = -40011; // XML build failed
-    const ILLEGAL_BUFFER = -41003; // Illegal buffer
-}
diff --git a/vendor/overtrue/wechat/src/Encryption/Encryptor.php b/vendor/overtrue/wechat/src/Encryption/Encryptor.php
deleted file mode 100644
index be53c24..0000000
--- a/vendor/overtrue/wechat/src/Encryption/Encryptor.php
+++ /dev/null
@@ -1,306 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Encryptor.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Encryption;
-
-use EasyWeChat\Core\Exceptions\InvalidConfigException;
-use EasyWeChat\Support\XML;
-use Exception as BaseException;
-
-/**
- * Class Encryptor.
- */
-class Encryptor
-{
-    /**
-     * App id.
-     *
-     * @var string
-     */
-    protected $appId;
-
-    /**
-     * App token.
-     *
-     * @var string
-     */
-    protected $token;
-
-    /**
-     * AES key.
-     *
-     * @var string
-     */
-    protected $AESKey;
-
-    /**
-     * Block size.
-     *
-     * @var int
-     */
-    protected $blockSize;
-
-    /**
-     * Constructor.
-     *
-     * @param string $appId
-     * @param string $token
-     * @param string $AESKey
-     */
-    public function __construct($appId, $token, $AESKey)
-    {
-        $this->appId = $appId;
-        $this->token = $token;
-        $this->AESKey = $AESKey;
-        $this->blockSize = 32;
-    }
-
-    /**
-     * Encrypt the message and return XML.
-     *
-     * @param string $xml
-     * @param string $nonce
-     * @param int    $timestamp
-     *
-     * @return string
-     */
-    public function encryptMsg($xml, $nonce = null, $timestamp = null)
-    {
-        $encrypt = $this->encrypt($xml, $this->appId);
-
-        !is_null($nonce) || $nonce = substr($this->appId, 0, 10);
-        !is_null($timestamp) || $timestamp = time();
-
-        //生成安全签名
-        $signature = $this->getSHA1($this->token, $timestamp, $nonce, $encrypt);
-
-        $response = [
-            'Encrypt' => $encrypt,
-            'MsgSignature' => $signature,
-            'TimeStamp' => $timestamp,
-            'Nonce' => $nonce,
-        ];
-
-        //生成响应xml
-        return XML::build($response);
-    }
-
-    /**
-     * Decrypt message.
-     *
-     * @param string $msgSignature
-     * @param string $nonce
-     * @param string $timestamp
-     * @param string $postXML
-     *
-     * @return array
-     *
-     * @throws EncryptionException
-     */
-    public function decryptMsg($msgSignature, $nonce, $timestamp, $postXML)
-    {
-        try {
-            $array = XML::parse($postXML);
-        } catch (BaseException $e) {
-            throw new EncryptionException('Invalid xml.', EncryptionException::ERROR_PARSE_XML);
-        }
-
-        $encrypted = $array['Encrypt'];
-
-        $signature = $this->getSHA1($this->token, $timestamp, $nonce, $encrypted);
-
-        if ($signature !== $msgSignature) {
-            throw new EncryptionException('Invalid Signature.', EncryptionException::ERROR_INVALID_SIGNATURE);
-        }
-
-        return XML::parse($this->decrypt($encrypted, $this->appId));
-    }
-
-    /**
-     * Get SHA1.
-     *
-     * @return string
-     *
-     * @throws EncryptionException
-     */
-    public function getSHA1()
-    {
-        try {
-            $array = func_get_args();
-            sort($array, SORT_STRING);
-
-            return sha1(implode($array));
-        } catch (BaseException $e) {
-            throw new EncryptionException($e->getMessage(), EncryptionException::ERROR_CALC_SIGNATURE);
-        }
-    }
-
-    /**
-     * Encode string.
-     *
-     * @param string $text
-     *
-     * @return string
-     */
-    public function encode($text)
-    {
-        $padAmount = $this->blockSize - (strlen($text) % $this->blockSize);
-
-        $padAmount = 0 !== $padAmount ? $padAmount : $this->blockSize;
-
-        $padChr = chr($padAmount);
-
-        $tmp = '';
-
-        for ($index = 0; $index < $padAmount; ++$index) {
-            $tmp .= $padChr;
-        }
-
-        return $text.$tmp;
-    }
-
-    /**
-     * Decode string.
-     *
-     * @param string $decrypted
-     *
-     * @return string
-     */
-    public function decode($decrypted)
-    {
-        $pad = ord(substr($decrypted, -1));
-
-        if ($pad < 1 || $pad > $this->blockSize) {
-            $pad = 0;
-        }
-
-        return substr($decrypted, 0, (strlen($decrypted) - $pad));
-    }
-
-    /**
-     * Return AESKey.
-     *
-     * @return string
-     *
-     * @throws InvalidConfigException
-     */
-    protected function getAESKey()
-    {
-        if (empty($this->AESKey)) {
-            throw new InvalidConfigException("Configuration mission, 'aes_key' is required.");
-        }
-
-        if (43 !== strlen($this->AESKey)) {
-            throw new InvalidConfigException("The length of 'aes_key' must be 43.");
-        }
-
-        return base64_decode($this->AESKey.'=', true);
-    }
-
-    /**
-     * Encrypt string.
-     *
-     * @param string $text
-     * @param string $appId
-     *
-     * @return string
-     *
-     * @throws EncryptionException
-     */
-    private function encrypt($text, $appId)
-    {
-        try {
-            $key = $this->getAESKey();
-            $random = $this->getRandomStr();
-            $text = $this->encode($random.pack('N', strlen($text)).$text.$appId);
-
-            $iv = substr($key, 0, 16);
-
-            $encrypted = openssl_encrypt($text, 'aes-256-cbc', $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $iv);
-
-            return base64_encode($encrypted);
-        } catch (BaseException $e) {
-            throw new EncryptionException($e->getMessage(), EncryptionException::ERROR_ENCRYPT_AES);
-        }
-    }
-
-    /**
-     * Decrypt message.
-     *
-     * @param string $encrypted
-     * @param string $appId
-     *
-     * @return string
-     *
-     * @throws EncryptionException
-     */
-    private function decrypt($encrypted, $appId)
-    {
-        try {
-            $key = $this->getAESKey();
-            $ciphertext = base64_decode($encrypted, true);
-            $iv = substr($key, 0, 16);
-
-            $decrypted = openssl_decrypt($ciphertext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $iv);
-        } catch (BaseException $e) {
-            throw new EncryptionException($e->getMessage(), EncryptionException::ERROR_DECRYPT_AES);
-        }
-
-        try {
-            $result = $this->decode($decrypted);
-
-            if (strlen($result) < 16) {
-                return '';
-            }
-
-            $content = substr($result, 16, strlen($result));
-            $listLen = unpack('N', substr($content, 0, 4));
-            $xmlLen = $listLen[1];
-            $xml = substr($content, 4, $xmlLen);
-            $fromAppId = trim(substr($content, $xmlLen + 4));
-        } catch (BaseException $e) {
-            throw new EncryptionException($e->getMessage(), EncryptionException::ERROR_INVALID_XML);
-        }
-
-        if ($fromAppId !== $appId) {
-            throw new EncryptionException('Invalid appId.', EncryptionException::ERROR_INVALID_APPID);
-        }
-
-        $dataSet = json_decode($xml, true);
-        if ($dataSet && (JSON_ERROR_NONE === json_last_error())) {
-            // For mini-program JSON formats.
-            // Convert to XML if the given string can be decode into a data array.
-            $xml = XML::build($dataSet);
-        }
-
-        return $xml;
-    }
-
-    /**
-     * Generate random string.
-     *
-     * @return string
-     */
-    private function getRandomStr()
-    {
-        return substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'), 0, 16);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Encryption/composer.json b/vendor/overtrue/wechat/src/Encryption/composer.json
deleted file mode 100644
index fd27fdf..0000000
--- a/vendor/overtrue/wechat/src/Encryption/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/encryption",
-    "description": "encryption module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "encryption", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "require": {
-        "ext-openssl": "*"
-    },
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Encryption\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "~5.0",
-        "mockery/mockery": "^1.0@dev"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/Application.php b/vendor/overtrue/wechat/src/Foundation/Application.php
deleted file mode 100644
index 6244f9f..0000000
--- a/vendor/overtrue/wechat/src/Foundation/Application.php
+++ /dev/null
@@ -1,294 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Application.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Foundation;
-
-use Doctrine\Common\Cache\Cache as CacheInterface;
-use Doctrine\Common\Cache\FilesystemCache;
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Core\AccessToken;
-use EasyWeChat\Core\Http;
-use EasyWeChat\Support\Log;
-use Monolog\Handler\HandlerInterface;
-use Monolog\Handler\NullHandler;
-use Monolog\Handler\StreamHandler;
-use Monolog\Logger;
-use Pimple\Container;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Class Application.
- *
- * @property \EasyWeChat\Core\AccessToken                    $access_token
- * @property \EasyWeChat\Server\Guard                        $server
- * @property \EasyWeChat\User\User                           $user
- * @property \EasyWeChat\User\Tag                            $user_tag
- * @property \EasyWeChat\User\Group                          $user_group
- * @property \EasyWeChat\Js\Js                               $js
- * @property \Overtrue\Socialite\Providers\WeChatProvider    $oauth
- * @property \EasyWeChat\Menu\Menu                           $menu
- * @property \EasyWeChat\Notice\Notice                       $notice
- * @property \EasyWeChat\Material\Material                   $material
- * @property \EasyWeChat\Material\Temporary                  $material_temporary
- * @property \EasyWeChat\Staff\Staff                         $staff
- * @property \EasyWeChat\Url\Url                             $url
- * @property \EasyWeChat\QRCode\QRCode                       $qrcode
- * @property \EasyWeChat\Semantic\Semantic                   $semantic
- * @property \EasyWeChat\Stats\Stats                         $stats
- * @property \EasyWeChat\Payment\Merchant                    $merchant
- * @property \EasyWeChat\Payment\Payment                     $payment
- * @property \EasyWeChat\Payment\LuckyMoney\LuckyMoney       $lucky_money
- * @property \EasyWeChat\Payment\MerchantPay\MerchantPay     $merchant_pay
- * @property \EasyWeChat\Payment\CashCoupon\CashCoupon       $cash_coupon
- * @property \EasyWeChat\Reply\Reply                         $reply
- * @property \EasyWeChat\Broadcast\Broadcast                 $broadcast
- * @property \EasyWeChat\Card\Card                           $card
- * @property \EasyWeChat\Device\Device                       $device
- * @property \EasyWeChat\Comment\Comment                     $comment
- * @property \EasyWeChat\ShakeAround\ShakeAround             $shakearound
- * @property \EasyWeChat\OpenPlatform\OpenPlatform           $open_platform
- * @property \EasyWeChat\MiniProgram\MiniProgram             $mini_program
- *
- * @method \EasyWeChat\Support\Collection clearQuota()
- * @method \EasyWeChat\Support\Collection getCallbackIp()
- */
-class Application extends Container
-{
-    /**
-     * Service Providers.
-     *
-     * @var array
-     */
-    protected $providers = [
-        ServiceProviders\FundamentalServiceProvider::class,
-        ServiceProviders\ServerServiceProvider::class,
-        ServiceProviders\UserServiceProvider::class,
-        ServiceProviders\JsServiceProvider::class,
-        ServiceProviders\OAuthServiceProvider::class,
-        ServiceProviders\MenuServiceProvider::class,
-        ServiceProviders\NoticeServiceProvider::class,
-        ServiceProviders\MaterialServiceProvider::class,
-        ServiceProviders\StaffServiceProvider::class,
-        ServiceProviders\UrlServiceProvider::class,
-        ServiceProviders\QRCodeServiceProvider::class,
-        ServiceProviders\SemanticServiceProvider::class,
-        ServiceProviders\StatsServiceProvider::class,
-        ServiceProviders\PaymentServiceProvider::class,
-        ServiceProviders\POIServiceProvider::class,
-        ServiceProviders\ReplyServiceProvider::class,
-        ServiceProviders\BroadcastServiceProvider::class,
-        ServiceProviders\CardServiceProvider::class,
-        ServiceProviders\DeviceServiceProvider::class,
-        ServiceProviders\ShakeAroundServiceProvider::class,
-        ServiceProviders\OpenPlatformServiceProvider::class,
-        ServiceProviders\MiniProgramServiceProvider::class,
-        ServiceProviders\CommentServiceProvider::class,
-    ];
-
-    /**
-     * Application constructor.
-     *
-     * @param array $config
-     */
-    public function __construct($config)
-    {
-        parent::__construct();
-
-        $this['config'] = function () use ($config) {
-            return new Config($config);
-        };
-
-        $this->registerProviders();
-        $this->registerBase();
-        $this->initializeLogger();
-
-        Http::setDefaultOptions($this['config']->get('guzzle', ['timeout' => 5.0]));
-
-        AbstractAPI::maxRetries($this['config']->get('max_retries', 2));
-
-        $this->logConfiguration($config);
-    }
-
-    /**
-     * Log configuration.
-     *
-     * @param array $config
-     */
-    public function logConfiguration($config)
-    {
-        $config = new Config($config);
-
-        $keys = ['app_id', 'secret', 'open_platform.app_id', 'open_platform.secret', 'mini_program.app_id', 'mini_program.secret'];
-        foreach ($keys as $key) {
-            !$config->has($key) || $config[$key] = '***'.substr($config[$key], -5);
-        }
-
-        Log::debug('Current config:', $config->toArray());
-    }
-
-    /**
-     * Add a provider.
-     *
-     * @param string $provider
-     *
-     * @return Application
-     */
-    public function addProvider($provider)
-    {
-        array_push($this->providers, $provider);
-
-        return $this;
-    }
-
-    /**
-     * Set providers.
-     *
-     * @param array $providers
-     */
-    public function setProviders(array $providers)
-    {
-        $this->providers = [];
-
-        foreach ($providers as $provider) {
-            $this->addProvider($provider);
-        }
-    }
-
-    /**
-     * Return all providers.
-     *
-     * @return array
-     */
-    public function getProviders()
-    {
-        return $this->providers;
-    }
-
-    /**
-     * Magic get access.
-     *
-     * @param string $id
-     *
-     * @return mixed
-     */
-    public function __get($id)
-    {
-        return $this->offsetGet($id);
-    }
-
-    /**
-     * Magic set access.
-     *
-     * @param string $id
-     * @param mixed  $value
-     */
-    public function __set($id, $value)
-    {
-        $this->offsetSet($id, $value);
-    }
-
-    /**
-     * Register providers.
-     */
-    private function registerProviders()
-    {
-        foreach ($this->providers as $provider) {
-            $this->register(new $provider());
-        }
-    }
-
-    /**
-     * Register basic providers.
-     */
-    private function registerBase()
-    {
-        $this['request'] = function () {
-            return Request::createFromGlobals();
-        };
-
-        if (!empty($this['config']['cache']) && $this['config']['cache'] instanceof CacheInterface) {
-            $this['cache'] = $this['config']['cache'];
-        } else {
-            $this['cache'] = function () {
-                return new FilesystemCache(sys_get_temp_dir());
-            };
-        }
-
-        $this['access_token'] = function () {
-            return new AccessToken(
-                $this['config']['app_id'],
-                $this['config']['secret'],
-                $this['cache']
-            );
-        };
-    }
-
-    /**
-     * Initialize logger.
-     */
-    private function initializeLogger()
-    {
-        if (Log::hasLogger()) {
-            return;
-        }
-
-        $logger = new Logger('easywechat');
-
-        if (!$this['config']['debug'] || defined('PHPUNIT_RUNNING')) {
-            $logger->pushHandler(new NullHandler());
-        } elseif ($this['config']['log.handler'] instanceof HandlerInterface) {
-            $logger->pushHandler($this['config']['log.handler']);
-        } elseif ($logFile = $this['config']['log.file']) {
-            $logger->pushHandler(new StreamHandler(
-                $logFile,
-                $this['config']->get('log.level', Logger::WARNING),
-                true,
-                $this['config']->get('log.permission', null))
-            );
-        }
-
-        Log::setLogger($logger);
-    }
-
-    /**
-     * Magic call.
-     *
-     * @param string $method
-     * @param array  $args
-     *
-     * @return mixed
-     *
-     * @throws \Exception
-     */
-    public function __call($method, $args)
-    {
-        if (is_callable([$this['fundamental.api'], $method])) {
-            return call_user_func_array([$this['fundamental.api'], $method], $args);
-        }
-
-        throw new \Exception("Call to undefined method {$method}()");
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/Config.php b/vendor/overtrue/wechat/src/Foundation/Config.php
deleted file mode 100644
index 23b636d..0000000
--- a/vendor/overtrue/wechat/src/Foundation/Config.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Config.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015
- *
- * @see      https://github.com/overtrue/wechat
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Foundation;
-
-use EasyWeChat\Support\Collection;
-
-/**
- * Class Config.
- */
-class Config extends Collection
-{
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/BroadcastServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/BroadcastServiceProvider.php
deleted file mode 100644
index 6c57ad3..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/BroadcastServiceProvider.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * BroadcastServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Broadcast\Broadcast;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class BroadcastServiceProvider.
- */
-class BroadcastServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['broadcast'] = function ($pimple) {
-            return new Broadcast($pimple['access_token']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/CardServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/CardServiceProvider.php
deleted file mode 100644
index a219dbc..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/CardServiceProvider.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * JsServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Card\Card;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class JsServiceProvider.
- */
-class CardServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['card'] = function ($pimple) {
-            $card = new Card($pimple['access_token']);
-            $card->setCache($pimple['cache']);
-
-            return $card;
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/CommentServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/CommentServiceProvider.php
deleted file mode 100644
index 068eb0b..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/CommentServiceProvider.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * CommentServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Comment\Comment;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-class CommentServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * {@inheritdoc}.
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['comment'] = function ($pimple) {
-            return new Comment($pimple['access_token']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/DeviceServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/DeviceServiceProvider.php
deleted file mode 100644
index cd4b820..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/DeviceServiceProvider.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * QRCodeServiceProvider.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    soone <66812590@qq.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue/wechat
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Device\Device;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class DeviceServiceProvider.
- */
-class DeviceServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['device'] = function ($pimple) {
-            return new Device($pimple['access_token'], $pimple['config']->get('device', []));
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/FundamentalServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/FundamentalServiceProvider.php
deleted file mode 100644
index a7dc2e3..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/FundamentalServiceProvider.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * FundamentalServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Fundamental\API;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class FundamentalServiceProvider.
- */
-class FundamentalServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * {@inheritdoc}.
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['fundamental.api'] = function ($pimple) {
-            return new API($pimple['access_token']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/JsServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/JsServiceProvider.php
deleted file mode 100644
index 8329d2b..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/JsServiceProvider.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * JsServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Js\Js;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class JsServiceProvider.
- */
-class JsServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['js'] = function ($pimple) {
-            $js = new Js($pimple['access_token']);
-            $js->setCache($pimple['cache']);
-
-            return $js;
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/MaterialServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/MaterialServiceProvider.php
deleted file mode 100644
index 7a6e85c..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/MaterialServiceProvider.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * MaterialServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Material\Material;
-use EasyWeChat\Material\Temporary;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class MaterialServiceProvider.
- */
-class MaterialServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['material'] = function ($pimple) {
-            return new Material($pimple['access_token']);
-        };
-
-        $temporary = function ($pimple) {
-            return new Temporary($pimple['access_token']);
-        };
-
-        $pimple['material_temporary'] = $temporary;
-        $pimple['material.temporary'] = $temporary;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/MenuServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/MenuServiceProvider.php
deleted file mode 100644
index 55b2b9e..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/MenuServiceProvider.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * MenuServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Menu\Menu;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class MenuServiceProvider.
- */
-class MenuServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['menu'] = function ($pimple) {
-            return new Menu($pimple['access_token']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/MiniProgramServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/MiniProgramServiceProvider.php
deleted file mode 100644
index 82091f5..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/MiniProgramServiceProvider.php
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * MiniProgramServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) mingyoung <mingyoungcheung@gmail.com>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\MiniProgram\AccessToken;
-use EasyWeChat\MiniProgram\Encryption\Encryptor;
-use EasyWeChat\MiniProgram\Material\Temporary;
-use EasyWeChat\MiniProgram\MiniProgram;
-use EasyWeChat\MiniProgram\Notice\Notice;
-use EasyWeChat\MiniProgram\QRCode\QRCode;
-use EasyWeChat\MiniProgram\Server\Guard;
-use EasyWeChat\MiniProgram\Sns\Sns;
-use EasyWeChat\MiniProgram\Staff\Staff;
-use EasyWeChat\MiniProgram\Stats\Stats;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class MiniProgramServiceProvider.
- */
-class MiniProgramServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['mini_program.access_token'] = function ($pimple) {
-            return new AccessToken(
-                $pimple['config']['mini_program']['app_id'],
-                $pimple['config']['mini_program']['secret'],
-                $pimple['cache']
-            );
-        };
-
-        $pimple['mini_program.encryptor'] = function ($pimple) {
-            return new Encryptor(
-                $pimple['config']['mini_program']['app_id'],
-                $pimple['config']['mini_program']['token'],
-                $pimple['config']['mini_program']['aes_key']
-            );
-        };
-
-        $pimple['mini_program.server'] = function ($pimple) {
-            $server = new Guard($pimple['config']['mini_program']['token']);
-            $server->debug($pimple['config']['debug']);
-            $server->setEncryptor($pimple['mini_program.encryptor']);
-
-            return $server;
-        };
-
-        $pimple['mini_program.staff'] = function ($pimple) {
-            return new Staff($pimple['mini_program.access_token']);
-        };
-
-        $pimple['mini_program.notice'] = function ($pimple) {
-            return new Notice($pimple['mini_program.access_token']);
-        };
-
-        $pimple['mini_program.material_temporary'] = function ($pimple) {
-            return new Temporary($pimple['mini_program.access_token']);
-        };
-
-        $pimple['mini_program.stats'] = function ($pimple) {
-            return new Stats(
-                $pimple['mini_program.access_token'],
-                $pimple['config']['mini_program']
-            );
-        };
-
-        $pimple['mini_program.sns'] = function ($pimple) {
-            return new Sns(
-                $pimple['mini_program.access_token'],
-                $pimple['config']['mini_program']
-            );
-        };
-
-        $pimple['mini_program.qrcode'] = function ($pimple) {
-            return new QRCode(
-                $pimple['mini_program.access_token'],
-                $pimple['config']['mini_program']
-            );
-        };
-
-        $pimple['mini_program'] = function ($pimple) {
-            return new MiniProgram($pimple);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/NoticeServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/NoticeServiceProvider.php
deleted file mode 100644
index 276e282..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/NoticeServiceProvider.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * NoticeServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Notice\Notice;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class NoticeServiceProvider.
- */
-class NoticeServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['notice'] = function ($pimple) {
-            return new Notice($pimple['access_token']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/OAuthServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/OAuthServiceProvider.php
deleted file mode 100644
index d726c9e..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/OAuthServiceProvider.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * OAuthServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use Overtrue\Socialite\SocialiteManager as Socialite;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class OAuthServiceProvider.
- */
-class OAuthServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['oauth'] = function ($pimple) {
-            $callback = $this->prepareCallbackUrl($pimple);
-            $scopes = $pimple['config']->get('oauth.scopes', []);
-            $config = [
-                'wechat' => [
-                    'client_id' => $pimple['config']['app_id'],
-                    'client_secret' => $pimple['config']['secret'],
-                    'redirect' => $callback,
-                ],
-            ];
-            if ($pimple['config']->has('guzzle')) {
-                $config['guzzle'] = $pimple['config']['guzzle'];
-            }
-            $socialite = (new Socialite($config))->driver('wechat');
-
-            if (!empty($scopes)) {
-                $socialite->scopes($scopes);
-            }
-
-            return $socialite;
-        };
-    }
-
-    /**
-     * Prepare the OAuth callback url for wechat.
-     *
-     * @param Container $pimple
-     *
-     * @return string
-     */
-    private function prepareCallbackUrl($pimple)
-    {
-        $callback = $pimple['config']->get('oauth.callback');
-        if (0 === stripos($callback, 'http')) {
-            return $callback;
-        }
-        $baseUrl = $pimple['request']->getSchemeAndHttpHost();
-
-        return $baseUrl.'/'.ltrim($callback, '/');
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/OpenPlatformServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/OpenPlatformServiceProvider.php
deleted file mode 100644
index 49dac30..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/OpenPlatformServiceProvider.php
+++ /dev/null
@@ -1,189 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * OpenPlatformServiceProvider.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @author    lixiao <leonlx126@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Encryption\Encryptor;
-use EasyWeChat\Foundation\Application;
-use EasyWeChat\OpenPlatform\AccessToken;
-use EasyWeChat\OpenPlatform\Api\BaseApi;
-use EasyWeChat\OpenPlatform\Api\PreAuthorization;
-use EasyWeChat\OpenPlatform\Authorizer;
-use EasyWeChat\OpenPlatform\AuthorizerAccessToken;
-use EasyWeChat\OpenPlatform\EventHandlers;
-use EasyWeChat\OpenPlatform\Guard;
-use EasyWeChat\OpenPlatform\OpenPlatform;
-use EasyWeChat\OpenPlatform\VerifyTicket;
-use Overtrue\Socialite\SocialiteManager as Socialite;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-class OpenPlatformServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['open_platform.verify_ticket'] = function ($pimple) {
-            return new VerifyTicket(
-                $pimple['config']['open_platform']['app_id'],
-                $pimple['cache']
-            );
-        };
-
-        $pimple['open_platform.access_token'] = function ($pimple) {
-            $accessToken = new AccessToken(
-                $pimple['config']['open_platform']['app_id'],
-                $pimple['config']['open_platform']['secret'],
-                $pimple['cache']
-            );
-            $accessToken->setVerifyTicket($pimple['open_platform.verify_ticket']);
-
-            return $accessToken;
-        };
-
-        $pimple['open_platform.encryptor'] = function ($pimple) {
-            return new Encryptor(
-                $pimple['config']['open_platform']['app_id'],
-                $pimple['config']['open_platform']['token'],
-                $pimple['config']['open_platform']['aes_key']
-            );
-        };
-
-        $pimple['open_platform'] = function ($pimple) {
-            return new OpenPlatform($pimple);
-        };
-
-        $pimple['open_platform.server'] = function ($pimple) {
-            $server = new Guard($pimple['config']['open_platform']['token']);
-            $server->debug($pimple['config']['debug']);
-            $server->setEncryptor($pimple['open_platform.encryptor']);
-            $server->setHandlers([
-                Guard::EVENT_AUTHORIZED => $pimple['open_platform.handlers.authorized'],
-                Guard::EVENT_UNAUTHORIZED => $pimple['open_platform.handlers.unauthorized'],
-                Guard::EVENT_UPDATE_AUTHORIZED => $pimple['open_platform.handlers.updateauthorized'],
-                Guard::EVENT_COMPONENT_VERIFY_TICKET => $pimple['open_platform.handlers.component_verify_ticket'],
-            ]);
-
-            return $server;
-        };
-
-        $pimple['open_platform.pre_auth'] = $pimple['open_platform.pre_authorization'] = function ($pimple) {
-            return new PreAuthorization(
-                $pimple['open_platform.access_token'],
-                $pimple['request']
-            );
-        };
-
-        $pimple['open_platform.api'] = function ($pimple) {
-            return new BaseApi(
-                $pimple['open_platform.access_token'],
-                $pimple['request']
-            );
-        };
-
-        $pimple['open_platform.authorizer'] = function ($pimple) {
-            return new Authorizer(
-                $pimple['open_platform.api'],
-                $pimple['config']['open_platform']['app_id'],
-                $pimple['cache']
-            );
-        };
-
-        $pimple['open_platform.authorizer_access_token'] = function ($pimple) {
-            return new AuthorizerAccessToken(
-                $pimple['config']['open_platform']['app_id'],
-                $pimple['open_platform.authorizer']
-            );
-        };
-
-        // Authorization events handlers.
-        $pimple['open_platform.handlers.component_verify_ticket'] = function ($pimple) {
-            return new EventHandlers\ComponentVerifyTicket($pimple['open_platform.verify_ticket']);
-        };
-        $pimple['open_platform.handlers.authorized'] = function () {
-            return new EventHandlers\Authorized();
-        };
-        $pimple['open_platform.handlers.updateauthorized'] = function () {
-            return new EventHandlers\UpdateAuthorized();
-        };
-        $pimple['open_platform.handlers.unauthorized'] = function () {
-            return new EventHandlers\Unauthorized();
-        };
-
-        $pimple['open_platform.app'] = function ($pimple) {
-            return new Application($pimple['config']->toArray());
-        };
-
-        // OAuth for OpenPlatform.
-        $pimple['open_platform.oauth'] = function ($pimple) {
-            $callback = $this->prepareCallbackUrl($pimple);
-            $scopes = $pimple['config']->get('open_platform.oauth.scopes', []);
-            $config = [
-                'wechat_open' => [
-                    'client_id' => $pimple['open_platform.authorizer']->getAppId(),
-                    'client_secret' => $pimple['open_platform.access_token'],
-                    'redirect' => $callback,
-                ],
-            ];
-            if ($pimple['config']->has('guzzle')) {
-                $config['guzzle'] = $pimple['config']['guzzle'];
-            }
-            $socialite = (new Socialite($config))->driver('wechat_open');
-
-            if (!empty($scopes)) {
-                $socialite->scopes($scopes);
-            }
-
-            return $socialite;
-        };
-    }
-
-    /**
-     * Prepare the OAuth callback url for wechat.
-     *
-     * @param Container $pimple
-     *
-     * @return string
-     */
-    private function prepareCallbackUrl($pimple)
-    {
-        $callback = $pimple['config']->get('oauth.callback');
-        if (0 === stripos($callback, 'http')) {
-            return $callback;
-        }
-        $baseUrl = $pimple['request']->getSchemeAndHttpHost();
-
-        return $baseUrl.'/'.ltrim($callback, '/');
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/POIServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/POIServiceProvider.php
deleted file mode 100644
index b1de174..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/POIServiceProvider.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * POIServiceProvider.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015
- *
- * @see      https://github.com/overtrue/wechat
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\POI\POI;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class POIServiceProvider.
- */
-class POIServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['poi'] = function ($pimple) {
-            return new POI($pimple['access_token']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/PaymentServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/PaymentServiceProvider.php
deleted file mode 100644
index 867a69e..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/PaymentServiceProvider.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * PaymentServiceProvider.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015
- *
- * @see      https://github.com/overtrue/wechat
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Payment\CashCoupon\CashCoupon;
-use EasyWeChat\Payment\LuckyMoney\LuckyMoney;
-use EasyWeChat\Payment\Merchant;
-use EasyWeChat\Payment\MerchantPay\MerchantPay;
-use EasyWeChat\Payment\Payment;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class PaymentServiceProvider.
- */
-class PaymentServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['merchant'] = function ($pimple) {
-            $config = array_merge(
-                ['app_id' => $pimple['config']['app_id']],
-                $pimple['config']->get('payment', [])
-            );
-
-            return new Merchant($config);
-        };
-
-        $pimple['payment'] = function ($pimple) {
-            $payment = new Payment($pimple['merchant'], $pimple['cache']);
-            $payment->sandboxMode(
-                (bool) $pimple['config']->get('payment.sandbox_mode')
-            );
-
-            return $payment;
-        };
-
-        $pimple['lucky_money'] = function ($pimple) {
-            return new LuckyMoney($pimple['merchant']);
-        };
-
-        $pimple['merchant_pay'] = function ($pimple) {
-            return new MerchantPay($pimple['merchant']);
-        };
-
-        $pimple['cash_coupon'] = function ($pimple) {
-            return new CashCoupon($pimple['merchant']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/QRCodeServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/QRCodeServiceProvider.php
deleted file mode 100644
index 149351d..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/QRCodeServiceProvider.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * QRCodeServiceProvider.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015
- *
- * @see      https://github.com/overtrue/wechat
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\QRCode\QRCode;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class QRCodeServiceProvider.
- */
-class QRCodeServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['qrcode'] = function ($pimple) {
-            return new QRCode($pimple['access_token']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/ReplyServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/ReplyServiceProvider.php
deleted file mode 100644
index cbafa98..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/ReplyServiceProvider.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * ReplyServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Reply\Reply;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class ReplyServiceProvider.
- */
-class ReplyServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['reply'] = function ($pimple) {
-            return new Reply($pimple['access_token']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/SemanticServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/SemanticServiceProvider.php
deleted file mode 100644
index 19147f1..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/SemanticServiceProvider.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * SemanticServiceProvider.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015
- *
- * @see      https://github.com/overtrue/wechat
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Semantic\Semantic;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class SemanticServiceProvider.
- */
-class SemanticServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['semantic'] = function ($pimple) {
-            return new Semantic($pimple['access_token']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/ServerServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/ServerServiceProvider.php
deleted file mode 100644
index 0bbeecb..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/ServerServiceProvider.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * ServerServiceProvider.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015
- *
- * @see      https://github.com/overtrue/wechat
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Encryption\Encryptor;
-use EasyWeChat\Server\Guard;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class ServerServiceProvider.
- */
-class ServerServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['encryptor'] = function ($pimple) {
-            return new Encryptor(
-                $pimple['config']['app_id'],
-                $pimple['config']['token'],
-                $pimple['config']['aes_key']
-            );
-        };
-
-        $pimple['server'] = function ($pimple) {
-            $server = new Guard($pimple['config']['token']);
-
-            $server->debug($pimple['config']['debug']);
-
-            $server->setEncryptor($pimple['encryptor']);
-
-            return $server;
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/ShakeAroundServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/ShakeAroundServiceProvider.php
deleted file mode 100644
index dde7f75..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/ShakeAroundServiceProvider.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * UserServiceProvider.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    allen05ren <allen05ren@outlook.com>
- * @copyright 2016 overtrue <i@overtrue.me>
- *
- * @see       https://github.com/overtrue/wechat
- * @see       http://overtrue.me
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\ShakeAround\ShakeAround;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class ShakeAroundServiceProvider.
- */
-class ShakeAroundServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['shakearound'] = function ($pimple) {
-            return new ShakeAround($pimple['access_token']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/StaffServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/StaffServiceProvider.php
deleted file mode 100644
index 6864fca..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/StaffServiceProvider.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * StaffServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Staff\Session;
-use EasyWeChat\Staff\Staff;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class StaffServiceProvider.
- */
-class StaffServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['staff'] = function ($pimple) {
-            return new Staff($pimple['access_token']);
-        };
-
-        $pimple['staff_session'] = $pimple['staff.session'] = function ($pimple) {
-            return new Session($pimple['access_token']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/StatsServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/StatsServiceProvider.php
deleted file mode 100644
index ed8e389..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/StatsServiceProvider.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * StatsServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Stats\Stats;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class StatsServiceProvider.
- */
-class StatsServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['stats'] = function ($pimple) {
-            return new Stats($pimple['access_token']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/UrlServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/UrlServiceProvider.php
deleted file mode 100644
index f16807b..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/UrlServiceProvider.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * UrlServiceProvider.php.
- *
- * This file is part of the wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\Url\Url;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class UrlServiceProvider.
- */
-class UrlServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['url'] = function ($pimple) {
-            return new Url($pimple['access_token']);
-        };
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/UserServiceProvider.php b/vendor/overtrue/wechat/src/Foundation/ServiceProviders/UserServiceProvider.php
deleted file mode 100644
index bf6897d..0000000
--- a/vendor/overtrue/wechat/src/Foundation/ServiceProviders/UserServiceProvider.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * UserServiceProvider.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015
- *
- * @see      https://github.com/overtrue/wechat
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Foundation\ServiceProviders;
-
-use EasyWeChat\User\Group;
-use EasyWeChat\User\Tag;
-use EasyWeChat\User\User;
-use Pimple\Container;
-use Pimple\ServiceProviderInterface;
-
-/**
- * Class UserServiceProvider.
- */
-class UserServiceProvider implements ServiceProviderInterface
-{
-    /**
-     * Registers services on the given container.
-     *
-     * This method should only be used to configure services and parameters.
-     * It should not get services.
-     *
-     * @param Container $pimple A container instance
-     */
-    public function register(Container $pimple)
-    {
-        $pimple['user'] = function ($pimple) {
-            return new User($pimple['access_token']);
-        };
-
-        $group = function ($pimple) {
-            return new Group($pimple['access_token']);
-        };
-
-        $tag = function ($pimple) {
-            return new Tag($pimple['access_token']);
-        };
-
-        $pimple['user_group'] = $group;
-        $pimple['user.group'] = $group;
-
-        $pimple['user_tag'] = $tag;
-        $pimple['user.tag'] = $tag;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Fundamental/API.php b/vendor/overtrue/wechat/src/Fundamental/API.php
deleted file mode 100644
index 41718e2..0000000
--- a/vendor/overtrue/wechat/src/Fundamental/API.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Fundamental API.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2017
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Fundamental;
-
-use EasyWeChat\Core\AbstractAPI;
-
-class API extends AbstractAPI
-{
-    const API_CLEAR_QUOTA = 'https://api.weixin.qq.com/cgi-bin/clear_quota';
-    const API_CALLBACK_IP = 'https://api.weixin.qq.com/cgi-bin/getcallbackip';
-
-    /**
-     * Clear quota.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function clearQuota()
-    {
-        $appid = $this->getAccessToken()->getAppId();
-
-        return $this->parseJSON('json', [self::API_CLEAR_QUOTA, compact('appid')]);
-    }
-
-    /**
-     * Get wechat callback ip.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getCallbackIp()
-    {
-        return $this->parseJSON('get', [self::API_CALLBACK_IP]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Js/Js.php b/vendor/overtrue/wechat/src/Js/Js.php
deleted file mode 100644
index 225ba42..0000000
--- a/vendor/overtrue/wechat/src/Js/Js.php
+++ /dev/null
@@ -1,212 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Js.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Js;
-
-use Doctrine\Common\Cache\Cache;
-use Doctrine\Common\Cache\FilesystemCache;
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Support\Str;
-use EasyWeChat\Support\Url as UrlHelper;
-
-/**
- * Class Js.
- */
-class Js extends AbstractAPI
-{
-    /**
-     * Cache.
-     *
-     * @var Cache
-     */
-    protected $cache;
-
-    /**
-     * Current URI.
-     *
-     * @var string
-     */
-    protected $url;
-
-    /**
-     * Ticket cache prefix.
-     */
-    const TICKET_CACHE_PREFIX = 'overtrue.wechat.jsapi_ticket.';
-
-    /**
-     * Api of ticket.
-     */
-    const API_TICKET = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket';
-
-    /**
-     * Get config json for jsapi.
-     *
-     * @param array $APIs
-     * @param bool  $debug
-     * @param bool  $beta
-     * @param bool  $json
-     *
-     * @return array|string
-     */
-    public function config(array $APIs, $debug = false, $beta = false, $json = true)
-    {
-        $signPackage = $this->signature();
-
-        $base = [
-                 'debug' => $debug,
-                 'beta' => $beta,
-                ];
-        $config = array_merge($base, $signPackage, ['jsApiList' => $APIs]);
-
-        return $json ? json_encode($config) : $config;
-    }
-
-    /**
-     * Return jsapi config as a PHP array.
-     *
-     * @param array $APIs
-     * @param bool  $debug
-     * @param bool  $beta
-     *
-     * @return array
-     */
-    public function getConfigArray(array $APIs, $debug = false, $beta = false)
-    {
-        return $this->config($APIs, $debug, $beta, false);
-    }
-
-    /**
-     * Get jsticket.
-     *
-     * @param bool $forceRefresh
-     *
-     * @return string
-     */
-    public function ticket($forceRefresh = false)
-    {
-        $key = self::TICKET_CACHE_PREFIX.$this->getAccessToken()->getAppId();
-        $ticket = $this->getCache()->fetch($key);
-
-        if (!$forceRefresh && !empty($ticket)) {
-            return $ticket;
-        }
-
-        $result = $this->parseJSON('get', [self::API_TICKET, ['type' => 'jsapi']]);
-
-        $this->getCache()->save($key, $result['ticket'], $result['expires_in'] - 500);
-
-        return $result['ticket'];
-    }
-
-    /**
-     * Build signature.
-     *
-     * @param string $url
-     * @param string $nonce
-     * @param int    $timestamp
-     *
-     * @return array
-     */
-    public function signature($url = null, $nonce = null, $timestamp = null)
-    {
-        $url = $url ? $url : $this->getUrl();
-        $nonce = $nonce ? $nonce : Str::quickRandom(10);
-        $timestamp = $timestamp ? $timestamp : time();
-        $ticket = $this->ticket();
-
-        $sign = [
-                 'appId' => $this->getAccessToken()->getAppId(),
-                 'nonceStr' => $nonce,
-                 'timestamp' => $timestamp,
-                 'url' => $url,
-                 'signature' => $this->getSignature($ticket, $nonce, $timestamp, $url),
-                ];
-
-        return $sign;
-    }
-
-    /**
-     * Sign the params.
-     *
-     * @param string $ticket
-     * @param string $nonce
-     * @param int    $timestamp
-     * @param string $url
-     *
-     * @return string
-     */
-    public function getSignature($ticket, $nonce, $timestamp, $url)
-    {
-        return sha1("jsapi_ticket={$ticket}&noncestr={$nonce}&timestamp={$timestamp}&url={$url}");
-    }
-
-    /**
-     * Set current url.
-     *
-     * @param string $url
-     *
-     * @return Js
-     */
-    public function setUrl($url)
-    {
-        $this->url = $url;
-
-        return $this;
-    }
-
-    /**
-     * Get current url.
-     *
-     * @return string
-     */
-    public function getUrl()
-    {
-        if ($this->url) {
-            return $this->url;
-        }
-
-        return UrlHelper::current();
-    }
-
-    /**
-     * Set cache manager.
-     *
-     * @param \Doctrine\Common\Cache\Cache $cache
-     *
-     * @return $this
-     */
-    public function setCache(Cache $cache)
-    {
-        $this->cache = $cache;
-
-        return $this;
-    }
-
-    /**
-     * Return cache manager.
-     *
-     * @return \Doctrine\Common\Cache\Cache
-     */
-    public function getCache()
-    {
-        return $this->cache ?: $this->cache = new FilesystemCache(sys_get_temp_dir());
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Js/LICENSE b/vendor/overtrue/wechat/src/Js/LICENSE
deleted file mode 100644
index 3a1dc92..0000000
--- a/vendor/overtrue/wechat/src/Js/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Easy WeChat
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Js/README.md b/vendor/overtrue/wechat/src/Js/README.md
deleted file mode 100644
index 0090bc9..0000000
--- a/vendor/overtrue/wechat/src/Js/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# JS
-微信 SDK JSSDK模块
diff --git a/vendor/overtrue/wechat/src/Js/composer.json b/vendor/overtrue/wechat/src/Js/composer.json
deleted file mode 100644
index cfe34b3..0000000
--- a/vendor/overtrue/wechat/src/Js/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/js",
-    "description": "js module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Js\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Material/LICENSE b/vendor/overtrue/wechat/src/Material/LICENSE
deleted file mode 100644
index 3a1dc92..0000000
--- a/vendor/overtrue/wechat/src/Material/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Easy WeChat
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Material/Material.php b/vendor/overtrue/wechat/src/Material/Material.php
deleted file mode 100644
index be703ae..0000000
--- a/vendor/overtrue/wechat/src/Material/Material.php
+++ /dev/null
@@ -1,293 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Material.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Material;
-
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Core\Exceptions\InvalidArgumentException;
-use EasyWeChat\Message\Article;
-
-/**
- * Class Material.
- */
-class Material extends AbstractAPI
-{
-    /**
-     * Allow media type.
-     *
-     * @var array
-     */
-    protected $allowTypes = ['image', 'voice', 'video', 'thumb', 'news_image'];
-
-    const API_GET = 'https://api.weixin.qq.com/cgi-bin/material/get_material';
-    const API_UPLOAD = 'https://api.weixin.qq.com/cgi-bin/material/add_material';
-    const API_DELETE = 'https://api.weixin.qq.com/cgi-bin/material/del_material';
-    const API_STATS = 'https://api.weixin.qq.com/cgi-bin/material/get_materialcount';
-    const API_LISTS = 'https://api.weixin.qq.com/cgi-bin/material/batchget_material';
-    const API_NEWS_UPLOAD = 'https://api.weixin.qq.com/cgi-bin/material/add_news';
-    const API_NEWS_UPDATE = 'https://api.weixin.qq.com/cgi-bin/material/update_news';
-    const API_NEWS_IMAGE_UPLOAD = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg';
-
-    /**
-     * Upload image.
-     *
-     * @param string $path
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function uploadImage($path)
-    {
-        return $this->uploadMedia('image', $path);
-    }
-
-    /**
-     * Upload voice.
-     *
-     * @param string $path
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function uploadVoice($path)
-    {
-        return $this->uploadMedia('voice', $path);
-    }
-
-    /**
-     * Upload thumb.
-     *
-     * @param string $path
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function uploadThumb($path)
-    {
-        return $this->uploadMedia('thumb', $path);
-    }
-
-    /**
-     * Upload video.
-     *
-     * @param string $path
-     * @param string $title
-     * @param string $description
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function uploadVideo($path, $title, $description)
-    {
-        $params = [
-            'description' => json_encode(
-                [
-                    'title' => $title,
-                    'introduction' => $description,
-                ], JSON_UNESCAPED_UNICODE),
-        ];
-
-        return $this->uploadMedia('video', $path, $params);
-    }
-
-    /**
-     * Upload articles.
-     *
-     * @param array|Article $articles
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function uploadArticle($articles)
-    {
-        if (!empty($articles['title']) || $articles instanceof Article) {
-            $articles = [$articles];
-        }
-
-        $params = ['articles' => array_map(function ($article) {
-            if ($article instanceof Article) {
-                return $article->only([
-                    'title', 'thumb_media_id', 'author', 'digest',
-                    'show_cover_pic', 'content', 'content_source_url',
-                    ]);
-            }
-
-            return $article;
-        }, $articles)];
-
-        return $this->parseJSON('json', [self::API_NEWS_UPLOAD, $params]);
-    }
-
-    /**
-     * Update article.
-     *
-     * @param string $mediaId
-     * @param array  $article
-     * @param int    $index
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function updateArticle($mediaId, $article, $index = 0)
-    {
-        $params = [
-            'media_id' => $mediaId,
-            'index' => $index,
-            'articles' => isset($article['title']) ? $article : (isset($article[$index]) ? $article[$index] : []),
-        ];
-
-        return $this->parseJSON('json', [self::API_NEWS_UPDATE, $params]);
-    }
-
-    /**
-     * Upload image for article.
-     *
-     * @param string $path
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function uploadArticleImage($path)
-    {
-        return $this->uploadMedia('news_image', $path);
-    }
-
-    /**
-     * Fetch material.
-     *
-     * @param string $mediaId
-     *
-     * @return mixed
-     */
-    public function get($mediaId)
-    {
-        $response = $this->getHttp()->json(self::API_GET, ['media_id' => $mediaId]);
-
-        foreach ($response->getHeader('Content-Type') as $mime) {
-            if (preg_match('/(image|video|audio)/i', $mime)) {
-                return $response->getBody();
-            }
-        }
-
-        $json = $this->getHttp()->parseJSON($response);
-
-        // XXX: 微信开发这帮混蛋,尼玛文件二进制输出不带header,简直日了!!!
-        if (!$json) {
-            return $response->getBody();
-        }
-
-        $this->checkAndThrow($json);
-
-        return $json;
-    }
-
-    /**
-     * Delete material by media ID.
-     *
-     * @param string $mediaId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function delete($mediaId)
-    {
-        return $this->parseJSON('json', [self::API_DELETE, ['media_id' => $mediaId]]);
-    }
-
-    /**
-     * List materials.
-     *
-     * example:
-     *
-     * {
-     *   "total_count": TOTAL_COUNT,
-     *   "item_count": ITEM_COUNT,
-     *   "item": [{
-     *             "media_id": MEDIA_ID,
-     *             "name": NAME,
-     *             "update_time": UPDATE_TIME
-     *         },
-     *         // more...
-     *   ]
-     * }
-     *
-     * @param string $type
-     * @param int    $offset
-     * @param int    $count
-     *
-     * @return array
-     */
-    public function lists($type, $offset = 0, $count = 20)
-    {
-        $params = [
-            'type' => $type,
-            'offset' => intval($offset),
-            'count' => min(20, $count),
-        ];
-
-        return $this->parseJSON('json', [self::API_LISTS, $params]);
-    }
-
-    /**
-     * Get stats of materials.
-     *
-     * @return array
-     */
-    public function stats()
-    {
-        return $this->parseJSON('get', [self::API_STATS]);
-    }
-
-    /**
-     * Upload material.
-     *
-     * @param string $type
-     * @param string $path
-     * @param array  $form
-     *
-     * @return \EasyWeChat\Support\Collection
-     *
-     * @throws InvalidArgumentException
-     */
-    protected function uploadMedia($type, $path, array $form = [])
-    {
-        if (!file_exists($path) || !is_readable($path)) {
-            throw new InvalidArgumentException("File does not exist, or the file is unreadable: '$path'");
-        }
-
-        $form['type'] = $type;
-
-        return $this->parseJSON('upload', [$this->getAPIByType($type), ['media' => $path], $form]);
-    }
-
-    /**
-     * Get API by type.
-     *
-     * @param string $type
-     *
-     * @return string
-     */
-    public function getAPIByType($type)
-    {
-        switch ($type) {
-            case 'news_image':
-                $api = self::API_NEWS_IMAGE_UPLOAD;
-
-                break;
-            default:
-                $api = self::API_UPLOAD;
-        }
-
-        return $api;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Material/README.md b/vendor/overtrue/wechat/src/Material/README.md
deleted file mode 100644
index 53c42fe..0000000
--- a/vendor/overtrue/wechat/src/Material/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# material
-微信 SDK 素材管理模块
diff --git a/vendor/overtrue/wechat/src/Material/Temporary.php b/vendor/overtrue/wechat/src/Material/Temporary.php
deleted file mode 100644
index aae77d7..0000000
--- a/vendor/overtrue/wechat/src/Material/Temporary.php
+++ /dev/null
@@ -1,175 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Temporary.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Material;
-
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Core\Exceptions\InvalidArgumentException;
-use EasyWeChat\Support\File;
-
-/**
- * Class Temporary.
- */
-class Temporary extends AbstractAPI
-{
-    /**
-     * Allow media type.
-     *
-     * @var array
-     */
-    protected $allowTypes = ['image', 'voice', 'video', 'thumb'];
-
-    const API_GET = 'https://api.weixin.qq.com/cgi-bin/media/get';
-    const API_UPLOAD = 'https://api.weixin.qq.com/cgi-bin/media/upload';
-
-    /**
-     * Download temporary material.
-     *
-     * @param string $mediaId
-     * @param string $directory
-     * @param string $filename
-     *
-     * @return string
-     *
-     * @throws InvalidArgumentException
-     */
-    public function download($mediaId, $directory, $filename = '')
-    {
-        if (!is_dir($directory) || !is_writable($directory)) {
-            throw new InvalidArgumentException("Directory does not exist or is not writable: '$directory'.");
-        }
-
-        $filename = $filename ?: $mediaId;
-
-        $stream = $this->getStream($mediaId);
-
-        $filename .= File::getStreamExt($stream);
-
-        file_put_contents($directory.'/'.$filename, $stream);
-
-        return $filename;
-    }
-
-    /**
-     * Fetch item from WeChat server.
-     *
-     * @param string $mediaId
-     *
-     * @return mixed
-     *
-     * @throws \EasyWeChat\Core\Exceptions\RuntimeException
-     */
-    public function getStream($mediaId)
-    {
-        $response = $this->getHttp()->get(self::API_GET, ['media_id' => $mediaId]);
-
-        $response->getBody()->rewind();
-
-        $body = $response->getBody()->getContents();
-
-        $json = json_decode($body, true);
-
-        if (JSON_ERROR_NONE === json_last_error()) {
-            $this->checkAndThrow($json);
-        }
-
-        return $body;
-    }
-
-    /**
-     * Upload temporary material.
-     *
-     * @param string $type
-     * @param string $path
-     *
-     * @return \EasyWeChat\Support\Collection
-     *
-     * @throws \EasyWeChat\Core\Exceptions\InvalidArgumentException
-     */
-    public function upload($type, $path)
-    {
-        if (!file_exists($path) || !is_readable($path)) {
-            throw new InvalidArgumentException("File does not exist, or the file is unreadable: '$path'");
-        }
-
-        if (!in_array($type, $this->allowTypes, true)) {
-            throw new InvalidArgumentException("Unsupported media type: '{$type}'");
-        }
-
-        return $this->parseJSON('upload', [self::API_UPLOAD, ['media' => $path], [], ['type' => $type]]);
-    }
-
-    /**
-     * Upload image.
-     *
-     * @param $path
-     *
-     * @return \EasyWeChat\Support\Collection
-     *
-     * @throws \EasyWeChat\Core\Exceptions\InvalidArgumentException
-     */
-    public function uploadImage($path)
-    {
-        return $this->upload('image', $path);
-    }
-
-    /**
-     * Upload video.
-     *
-     * @param $path
-     *
-     * @return \EasyWeChat\Support\Collection
-     *
-     * @throws \EasyWeChat\Core\Exceptions\InvalidArgumentException
-     */
-    public function uploadVideo($path)
-    {
-        return $this->upload('video', $path);
-    }
-
-    /**
-     * Upload voice.
-     *
-     * @param $path
-     *
-     * @return \EasyWeChat\Support\Collection
-     *
-     * @throws \EasyWeChat\Core\Exceptions\InvalidArgumentException
-     */
-    public function uploadVoice($path)
-    {
-        return $this->upload('voice', $path);
-    }
-
-    /**
-     * Upload thumb.
-     *
-     * @param $path
-     *
-     * @return \EasyWeChat\Support\Collection
-     *
-     * @throws \EasyWeChat\Core\Exceptions\InvalidArgumentException
-     */
-    public function uploadThumb($path)
-    {
-        return $this->upload('thumb', $path);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Material/composer.json b/vendor/overtrue/wechat/src/Material/composer.json
deleted file mode 100644
index 92bb955..0000000
--- a/vendor/overtrue/wechat/src/Material/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/material",
-    "description": "material module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "material", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Material\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Menu/LICENSE b/vendor/overtrue/wechat/src/Menu/LICENSE
deleted file mode 100644
index c5251b8..0000000
--- a/vendor/overtrue/wechat/src/Menu/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 overtrue <anzhengchao@gmail.com>
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Menu/Menu.php b/vendor/overtrue/wechat/src/Menu/Menu.php
deleted file mode 100644
index f5a6d97..0000000
--- a/vendor/overtrue/wechat/src/Menu/Menu.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Menu.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Menu;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class Menu.
- */
-class Menu extends AbstractAPI
-{
-    const API_CREATE = 'https://api.weixin.qq.com/cgi-bin/menu/create';
-    const API_GET = 'https://api.weixin.qq.com/cgi-bin/menu/get';
-    const API_DELETE = 'https://api.weixin.qq.com/cgi-bin/menu/delete';
-    const API_QUERY = 'https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info';
-    const API_CONDITIONAL_CREATE = 'https://api.weixin.qq.com/cgi-bin/menu/addconditional';
-    const API_CONDITIONAL_DELETE = 'https://api.weixin.qq.com/cgi-bin/menu/delconditional';
-    const API_CONDITIONAL_TEST = 'https://api.weixin.qq.com/cgi-bin/menu/trymatch';
-
-    /**
-     * Get all menus.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function all()
-    {
-        return $this->parseJSON('get', [self::API_GET]);
-    }
-
-    /**
-     * Get current menus.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function current()
-    {
-        return $this->parseJSON('get', [self::API_QUERY]);
-    }
-
-    /**
-     * Add menu.
-     *
-     * @param array $buttons
-     * @param array $matchRule
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function add(array $buttons, array $matchRule = [])
-    {
-        if (!empty($matchRule)) {
-            return $this->parseJSON('json', [self::API_CONDITIONAL_CREATE, [
-                'button' => $buttons,
-                'matchrule' => $matchRule,
-            ]]);
-        }
-
-        return $this->parseJSON('json', [self::API_CREATE, ['button' => $buttons]]);
-    }
-
-    /**
-     * Destroy menu.
-     *
-     * @param int $menuId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function destroy($menuId = null)
-    {
-        if (null !== $menuId) {
-            return $this->parseJSON('json', [self::API_CONDITIONAL_DELETE, ['menuid' => $menuId]]);
-        }
-
-        return  $this->parseJSON('get', [self::API_DELETE]);
-    }
-
-    /**
-     * Test conditional menu.
-     *
-     * @param string $userId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function test($userId)
-    {
-        return $this->parseJSON('json', [self::API_CONDITIONAL_TEST, ['user_id' => $userId]]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Menu/README.md b/vendor/overtrue/wechat/src/Menu/README.md
deleted file mode 100644
index 872d2c0..0000000
--- a/vendor/overtrue/wechat/src/Menu/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# menu
-微信 SDK 自定义菜单模块
diff --git a/vendor/overtrue/wechat/src/Menu/composer.json b/vendor/overtrue/wechat/src/Menu/composer.json
deleted file mode 100644
index 36f3c44..0000000
--- a/vendor/overtrue/wechat/src/Menu/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/menu",
-    "description": "menu module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "menu", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Menu\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Message/AbstractMessage.php b/vendor/overtrue/wechat/src/Message/AbstractMessage.php
deleted file mode 100644
index 663b819..0000000
--- a/vendor/overtrue/wechat/src/Message/AbstractMessage.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * AbstractMessage.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-use EasyWeChat\Support\Attribute;
-
-/**
- * Class AbstractMessage.
- */
-abstract class AbstractMessage extends Attribute
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type;
-
-    /**
-     * Message id.
-     *
-     * @var int
-     */
-    protected $id;
-
-    /**
-     * Message target user open id.
-     *
-     * @var string
-     */
-    protected $to;
-
-    /**
-     * Message sender open id.
-     *
-     * @var string
-     */
-    protected $from;
-
-    /**
-     * Message attributes.
-     *
-     * @var array
-     */
-    protected $properties = [];
-
-    /**
-     * Return type name message.
-     *
-     * @return string
-     */
-    public function getType()
-    {
-        return $this->type;
-    }
-
-    /**
-     * Magic getter.
-     *
-     * @param string $property
-     *
-     * @return mixed
-     */
-    public function __get($property)
-    {
-        if (property_exists($this, $property)) {
-            return $this->$property;
-        }
-
-        return parent::__get($property);
-    }
-
-    /**
-     * Magic setter.
-     *
-     * @param string $property
-     * @param mixed  $value
-     *
-     * @return AbstractMessage
-     */
-    public function __set($property, $value)
-    {
-        if (property_exists($this, $property)) {
-            $this->$property = $value;
-        } else {
-            parent::__set($property, $value);
-        }
-
-        return $this;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Message/Article.php b/vendor/overtrue/wechat/src/Message/Article.php
deleted file mode 100644
index 904d8ab..0000000
--- a/vendor/overtrue/wechat/src/Message/Article.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Article.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class Article.
- */
-class Article extends AbstractMessage
-{
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = [
-                                'thumb_media_id',
-                                'author',
-                                'title',
-                                'content',
-                                'digest',
-                                'source_url',
-                                'show_cover',
-                            ];
-
-    /**
-     * Aliases of attribute.
-     *
-     * @var array
-     */
-    protected $aliases = [
-        'source_url' => 'content_source_url',
-        'show_cover' => 'show_cover_pic',
-    ];
-}
diff --git a/vendor/overtrue/wechat/src/Message/Card.php b/vendor/overtrue/wechat/src/Message/Card.php
deleted file mode 100644
index 417dece..0000000
--- a/vendor/overtrue/wechat/src/Message/Card.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Card.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class Card.
- */
-class Card extends AbstractMessage
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type = 'wxcard';
-
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = ['card_id'];
-
-    /**
-     * Material constructor.
-     *
-     * @param string $mediaId
-     * @param string $type
-     */
-    public function __construct($cardId)
-    {
-        $this->set('card_id', $cardId);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Message/DeviceEvent.php b/vendor/overtrue/wechat/src/Message/DeviceEvent.php
deleted file mode 100644
index 660a640..0000000
--- a/vendor/overtrue/wechat/src/Message/DeviceEvent.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class DeviceEvent.
- *
- * @property string $media_id
- */
-class DeviceEvent extends AbstractMessage
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type = 'device_event';
-
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = [
-        'device_type',
-        'device_id',
-        'content',
-        'session_id',
-        'open_id',
-    ];
-}
diff --git a/vendor/overtrue/wechat/src/Message/DeviceText.php b/vendor/overtrue/wechat/src/Message/DeviceText.php
deleted file mode 100644
index 5aa1fce..0000000
--- a/vendor/overtrue/wechat/src/Message/DeviceText.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class DeviceText.
- *
- * @property string $content
- */
-class DeviceText extends AbstractMessage
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type = 'device_text';
-
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = [
-        'device_type',
-        'device_id',
-        'content',
-        'session_id',
-        'open_id',
-    ];
-}
diff --git a/vendor/overtrue/wechat/src/Message/Image.php b/vendor/overtrue/wechat/src/Message/Image.php
deleted file mode 100644
index 03a636f..0000000
--- a/vendor/overtrue/wechat/src/Message/Image.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Image.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class Image.
- *
- * @property string $media_id
- */
-class Image extends AbstractMessage
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type = 'image';
-
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = ['media_id'];
-
-    /**
-     * Set media_id.
-     *
-     * @param string $mediaId
-     *
-     * @return Image
-     */
-    public function media($mediaId)
-    {
-        $this->setAttribute('media_id', $mediaId);
-
-        return $this;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Message/Link.php b/vendor/overtrue/wechat/src/Message/Link.php
deleted file mode 100644
index 98066c8..0000000
--- a/vendor/overtrue/wechat/src/Message/Link.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Link.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class Link.
- */
-class Link extends AbstractMessage
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type = 'link';
-
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = [
-                             'title',
-                             'description',
-                             'url',
-                            ];
-}
diff --git a/vendor/overtrue/wechat/src/Message/Location.php b/vendor/overtrue/wechat/src/Message/Location.php
deleted file mode 100644
index 53a15eb..0000000
--- a/vendor/overtrue/wechat/src/Message/Location.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Location.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class Location.
- */
-class Location extends AbstractMessage
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type = 'location';
-
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = [
-                             'latitude',
-                             'longitude',
-                             'scale',
-                             'label',
-                             'precision',
-                            ];
-}
diff --git a/vendor/overtrue/wechat/src/Message/Material.php b/vendor/overtrue/wechat/src/Message/Material.php
deleted file mode 100644
index 2574f0b..0000000
--- a/vendor/overtrue/wechat/src/Message/Material.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Material.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class Material.
- */
-class Material extends AbstractMessage
-{
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = ['media_id'];
-
-    /**
-     * Material constructor.
-     *
-     * @param string $mediaId
-     * @param string $type
-     */
-    public function __construct($type, $mediaId)
-    {
-        $this->set('media_id', $mediaId);
-        $this->type = $type;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Message/MiniProgramPage.php b/vendor/overtrue/wechat/src/Message/MiniProgramPage.php
deleted file mode 100644
index 0e81a3c..0000000
--- a/vendor/overtrue/wechat/src/Message/MiniProgramPage.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Message;
-
-class MiniProgramPage extends AbstractMessage
-{
-    protected $type = 'miniprogrampage';
-
-    protected $properties = [
-        'title',
-        'appid',
-        'pagepath',
-        'thumb_media_id',
-    ];
-
-    /**
-     * 小程序卡片图片的媒体ID,小程序卡片图片建议大小为520*416
-     * mediaId需后台通过api上传后获取.
-     *
-     * @param string $mediaId
-     *
-     * @return $this
-     */
-    public function thumb($mediaId)
-    {
-        $this->setAttribute('thumb_media_id', $mediaId);
-
-        return $this;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Message/Music.php b/vendor/overtrue/wechat/src/Message/Music.php
deleted file mode 100644
index aca039c..0000000
--- a/vendor/overtrue/wechat/src/Message/Music.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Music.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class Music.
- *
- * @property string $url
- * @property string $hq_url
- * @property string $title
- * @property string $description
- * @property string $thumb_media_id
- * @property string $format
- */
-class Music extends AbstractMessage
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type = 'music';
-
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = [
-        'title',
-        'description',
-        'url',
-        'hq_url',
-        'thumb_media_id',
-        'format',
-    ];
-
-    /**
-     * 设置音乐封面.
-     *
-     * @param string $mediaId
-     *
-     * @return $this
-     */
-    public function thumb($mediaId)
-    {
-        $this->setAttribute('thumb_media_id', $mediaId);
-
-        return $this;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Message/News.php b/vendor/overtrue/wechat/src/Message/News.php
deleted file mode 100644
index 1adf22a..0000000
--- a/vendor/overtrue/wechat/src/Message/News.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * News.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class News.
- */
-class News extends AbstractMessage
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type = 'news';
-
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = [
-                                'title',
-                                'description',
-                                'url',
-                                'image',
-                            ];
-
-    /**
-     * Aliases of attribute.
-     *
-     * @var array
-     */
-    protected $aliases = [
-        'image' => 'pic_url',
-    ];
-}
diff --git a/vendor/overtrue/wechat/src/Message/README.md b/vendor/overtrue/wechat/src/Message/README.md
deleted file mode 100644
index 88765ae..0000000
--- a/vendor/overtrue/wechat/src/Message/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# message
-
-message
diff --git a/vendor/overtrue/wechat/src/Message/Raw.php b/vendor/overtrue/wechat/src/Message/Raw.php
deleted file mode 100644
index 87f1cf9..0000000
--- a/vendor/overtrue/wechat/src/Message/Raw.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Raw.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class Raw.
- */
-class Raw extends AbstractMessage
-{
-    /**
-     * @var string
-     */
-    protected $type = 'raw';
-
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = ['content'];
-
-    /**
-     * Constructor.
-     *
-     * @param string $content
-     */
-    public function __construct($content)
-    {
-        parent::__construct(['content' => strval($content)]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Message/ShortVideo.php b/vendor/overtrue/wechat/src/Message/ShortVideo.php
deleted file mode 100644
index da18a78..0000000
--- a/vendor/overtrue/wechat/src/Message/ShortVideo.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * ShortVideo.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class ShortVideo.
- *
- * @property string $title
- * @property string $media_id
- * @property string $description
- * @property string $thumb_media_id
- */
-class ShortVideo extends Video
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type = 'shortvideo';
-}
diff --git a/vendor/overtrue/wechat/src/Message/Text.php b/vendor/overtrue/wechat/src/Message/Text.php
deleted file mode 100644
index 7389ffe..0000000
--- a/vendor/overtrue/wechat/src/Message/Text.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Text.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class Text.
- *
- * @property string $content
- */
-class Text extends AbstractMessage
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type = 'text';
-
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = ['content'];
-}
diff --git a/vendor/overtrue/wechat/src/Message/Transfer.php b/vendor/overtrue/wechat/src/Message/Transfer.php
deleted file mode 100644
index fc5f60e..0000000
--- a/vendor/overtrue/wechat/src/Message/Transfer.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Transfer.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class Transfer.
- *
- * @property string $to
- * @property string $account
- */
-class Transfer extends AbstractMessage
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type = 'transfer_customer_service';
-
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = [
-                             'account',
-                            ];
-}
diff --git a/vendor/overtrue/wechat/src/Message/Video.php b/vendor/overtrue/wechat/src/Message/Video.php
deleted file mode 100644
index bb3aac5..0000000
--- a/vendor/overtrue/wechat/src/Message/Video.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Video.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class Video.
- *
- * @property string $video
- * @property string $title
- * @property string $media_id
- * @property string $description
- * @property string $thumb_media_id
- */
-class Video extends AbstractMessage
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type = 'video';
-
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = [
-                             'title',
-                             'description',
-                             'media_id',
-                             'thumb_media_id',
-                            ];
-
-    /**
-     * 设置视频消息.
-     *
-     * @param string $mediaId
-     *
-     * @return Video
-     */
-    public function media($mediaId)
-    {
-        $this->setAttribute('media_id', $mediaId);
-
-        return $this;
-    }
-
-    /**
-     * 设置视频封面.
-     *
-     * @param string $mediaId
-     *
-     * @return Video
-     */
-    public function thumb($mediaId)
-    {
-        $this->setAttribute('thumb_media_id', $mediaId);
-
-        return $this;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Message/Voice.php b/vendor/overtrue/wechat/src/Message/Voice.php
deleted file mode 100644
index 459d3e0..0000000
--- a/vendor/overtrue/wechat/src/Message/Voice.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Voice.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Message;
-
-/**
- * Class Voice.
- *
- * @property string $media_id
- */
-class Voice extends AbstractMessage
-{
-    /**
-     * Message type.
-     *
-     * @var string
-     */
-    protected $type = 'voice';
-
-    /**
-     * Properties.
-     *
-     * @var array
-     */
-    protected $properties = [
-                                'media_id',
-                                'recognition',
-                            ];
-
-    /**
-     * Set media id.
-     *
-     * @param string $mediaId
-     *
-     * @return Voice
-     */
-    public function media($mediaId)
-    {
-        $this->setAttribute('media_id', $mediaId);
-
-        return $this;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Message/composer.json b/vendor/overtrue/wechat/src/Message/composer.json
deleted file mode 100644
index b7f609d..0000000
--- a/vendor/overtrue/wechat/src/Message/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/message",
-    "description": "message module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "message", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Message\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "~4.0",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/support": "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/MiniProgram/AccessToken.php b/vendor/overtrue/wechat/src/MiniProgram/AccessToken.php
deleted file mode 100644
index 85f95ed..0000000
--- a/vendor/overtrue/wechat/src/MiniProgram/AccessToken.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * AccessToken.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\MiniProgram;
-
-use EasyWeChat\Core\AccessToken as CoreAccessToken;
-
-/**
- * Class AccessToken.
- */
-class AccessToken extends CoreAccessToken
-{
-    /**
-     * {@inheritdoc}.
-     */
-    protected $prefix = 'easywechat.common.mini.program.access_token.';
-}
diff --git a/vendor/overtrue/wechat/src/MiniProgram/Core/AbstractMiniProgram.php b/vendor/overtrue/wechat/src/MiniProgram/Core/AbstractMiniProgram.php
deleted file mode 100644
index 7cb85ee..0000000
--- a/vendor/overtrue/wechat/src/MiniProgram/Core/AbstractMiniProgram.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * AbstractMiniProgram.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\MiniProgram\Core;
-
-use EasyWeChat\Core\AbstractAPI;
-
-class AbstractMiniProgram extends AbstractAPI
-{
-    /**
-     * Mini program config.
-     *
-     * @var array
-     */
-    protected $config;
-
-    /**
-     * AbstractMiniProgram constructor.
-     *
-     * @param \EasyWeChat\MiniProgram\AccessToken $accessToken
-     * @param array                               $config
-     */
-    public function __construct($accessToken, $config)
-    {
-        parent::__construct($accessToken);
-
-        $this->config = $config;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/MiniProgram/Encryption/Encryptor.php b/vendor/overtrue/wechat/src/MiniProgram/Encryption/Encryptor.php
deleted file mode 100644
index 251ad6c..0000000
--- a/vendor/overtrue/wechat/src/MiniProgram/Encryption/Encryptor.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Encryptor.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\MiniProgram\Encryption;
-
-use EasyWeChat\Encryption\EncryptionException;
-use EasyWeChat\Encryption\Encryptor as BaseEncryptor;
-use Exception;
-
-class Encryptor extends BaseEncryptor
-{
-    /**
-     * Decrypt data.
-     *
-     * @param string $sessionKey
-     * @param string $iv
-     * @param string $encrypted
-     *
-     * @return array
-     */
-    public function decryptData($sessionKey, $iv, $encrypted)
-    {
-        try {
-            $decrypted = openssl_decrypt(
-                base64_decode($encrypted, true), 'aes-128-cbc', base64_decode($sessionKey, true),
-                OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, base64_decode($iv, true)
-            );
-        } catch (Exception $e) {
-            throw new EncryptionException($e->getMessage(), EncryptionException::ERROR_DECRYPT_AES);
-        }
-
-        if (is_null($result = json_decode($this->decode($decrypted), true))) {
-            throw new EncryptionException('ILLEGAL_BUFFER', EncryptionException::ILLEGAL_BUFFER);
-        }
-
-        return $result;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/MiniProgram/Material/Temporary.php b/vendor/overtrue/wechat/src/MiniProgram/Material/Temporary.php
deleted file mode 100644
index 312c78c..0000000
--- a/vendor/overtrue/wechat/src/MiniProgram/Material/Temporary.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Temporary.php.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\MiniProgram\Material;
-
-use EasyWeChat\Material\Temporary as MaterialTemporary;
-
-/**
- * Class Temporary.
- */
-class Temporary extends MaterialTemporary
-{
-}
diff --git a/vendor/overtrue/wechat/src/MiniProgram/MiniProgram.php b/vendor/overtrue/wechat/src/MiniProgram/MiniProgram.php
deleted file mode 100644
index 21598de..0000000
--- a/vendor/overtrue/wechat/src/MiniProgram/MiniProgram.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * MiniProgram.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\MiniProgram;
-
-use EasyWeChat\Support\Traits\PrefixedContainer;
-
-/**
- * Class MiniProgram.
- *
- * @property \EasyWeChat\MiniProgram\Server\Guard $server
- * @property \EasyWeChat\MiniProgram\Sns\Sns $sns
- * @property \EasyWeChat\MiniProgram\Notice\Notice $notice
- * @property \EasyWeChat\MiniProgram\Staff\Staff $staff
- * @property \EasyWeChat\MiniProgram\QRCode\QRCode $qrcode
- * @property \EasyWeChat\MiniProgram\Material\Temporary $material_temporary
- * @property \EasyWeChat\MiniProgram\Stats\Stats $stats
- */
-class MiniProgram
-{
-    use PrefixedContainer;
-}
diff --git a/vendor/overtrue/wechat/src/MiniProgram/Notice/Notice.php b/vendor/overtrue/wechat/src/MiniProgram/Notice/Notice.php
deleted file mode 100644
index 8dde3cf..0000000
--- a/vendor/overtrue/wechat/src/MiniProgram/Notice/Notice.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Notice.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\MiniProgram\Notice;
-
-use EasyWeChat\Notice\Notice as BaseNotice;
-
-class Notice extends BaseNotice
-{
-    /**
-     * {@inheritdoc}.
-     */
-    protected $message = [
-        'touser' => '',
-        'template_id' => '',
-        'page' => '',
-        'form_id' => '',
-        'data' => [],
-        'emphasis_keyword' => '',
-    ];
-
-    /**
-     * {@inheritdoc}.
-     */
-    protected $defaults = [
-        'touser' => '',
-        'template_id' => '',
-        'form_id' => '',
-        'data' => [],
-    ];
-
-    /**
-     * {@inheritdoc}.
-     */
-    protected $required = ['touser', 'template_id', 'form_id'];
-
-    /**
-     * Send notice message.
-     */
-    const API_SEND_NOTICE = 'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send';
-}
diff --git a/vendor/overtrue/wechat/src/MiniProgram/QRCode/QRCode.php b/vendor/overtrue/wechat/src/MiniProgram/QRCode/QRCode.php
deleted file mode 100644
index 6692859..0000000
--- a/vendor/overtrue/wechat/src/MiniProgram/QRCode/QRCode.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * QRCode.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\MiniProgram\QRCode;
-
-use EasyWeChat\MiniProgram\Core\AbstractMiniProgram;
-
-class QRCode extends AbstractMiniProgram
-{
-    const API_GET_WXACODE = 'https://api.weixin.qq.com/wxa/getwxacode';
-    const API_GET_WXACODE_UNLIMIT = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit';
-    const API_CREATE_QRCODE = 'https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode';
-
-    /**
-     * Get WXACode.
-     *
-     * @param string $path
-     * @param int    $width
-     * @param bool   $autoColor
-     * @param array  $lineColor
-     *
-     * @return \Psr\Http\Message\StreamInterface
-     */
-    public function getAppCode($path, $width = 430, $autoColor = false, $lineColor = ['r' => 0, 'g' => 0, 'b' => 0])
-    {
-        $params = [
-            'path' => $path,
-            'width' => $width,
-            'auto_color' => $autoColor,
-            'line_color' => $lineColor,
-        ];
-
-        return $this->getStream(self::API_GET_WXACODE, $params);
-    }
-
-    /**
-     * Get WXACode unlimit.
-     *
-     * @param string $scene
-     * @param int    $width
-     * @param bool   $autoColor
-     * @param array  $lineColor
-     *
-     * @return \Psr\Http\Message\StreamInterface
-     */
-    public function getAppCodeUnlimit($scene, $width = 430, $autoColor = false, $lineColor = ['r' => 0, 'g' => 0, 'b' => 0])
-    {
-        $params = [
-            'scene' => $scene,
-            'width' => $width,
-            'auto_color' => $autoColor,
-            'line_color' => $lineColor,
-        ];
-
-        return $this->getStream(self::API_GET_WXACODE_UNLIMIT, $params);
-    }
-
-    /**
-     * Get app code unlimit.
-     *
-     * @param string $scene
-     * @param string $page
-     * @param int    $width
-     * @param bool   $autoColor
-     * @param array  $lineColor
-     *
-     * @return \Psr\Http\Message\StreamInterface
-     */
-    public function appCodeUnlimit($scene, $page = null, $width = null, $autoColor = null, $lineColor = null)
-    {
-        $params = [
-            'scene' => $scene,
-            'page' => $page,
-            'width' => $width,
-            'auto_color' => $autoColor,
-            'line_color' => $lineColor,
-        ];
-
-        return $this->getStream(self::API_GET_WXACODE_UNLIMIT, $params);
-    }
-
-    /**
-     * Create QRCode.
-     *
-     * @param string $path
-     * @param int    $width
-     *
-     * @return \Psr\Http\Message\StreamInterface
-     */
-    public function createQRCode($path, $width = 430)
-    {
-        return $this->getStream(self::API_CREATE_QRCODE, compact('path', 'width'));
-    }
-
-    /**
-     * Get stream.
-     *
-     * @param string $endpoint
-     * @param array  $params
-     *
-     * @return \Psr\Http\Message\StreamInterface
-     */
-    protected function getStream($endpoint, $params)
-    {
-        return $this->getHttp()->json($endpoint, $params)->getBody();
-    }
-}
diff --git a/vendor/overtrue/wechat/src/MiniProgram/Server/Guard.php b/vendor/overtrue/wechat/src/MiniProgram/Server/Guard.php
deleted file mode 100644
index 4021c4c..0000000
--- a/vendor/overtrue/wechat/src/MiniProgram/Server/Guard.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Guard.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\MiniProgram\Server;
-
-use EasyWeChat\Server\Guard as ServerGuard;
-
-class Guard extends ServerGuard
-{
-}
diff --git a/vendor/overtrue/wechat/src/MiniProgram/Sns/Sns.php b/vendor/overtrue/wechat/src/MiniProgram/Sns/Sns.php
deleted file mode 100644
index 4d1f4da..0000000
--- a/vendor/overtrue/wechat/src/MiniProgram/Sns/Sns.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * User.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\MiniProgram\Sns;
-
-use EasyWeChat\MiniProgram\Core\AbstractMiniProgram;
-
-class Sns extends AbstractMiniProgram
-{
-    /**
-     * Api.
-     */
-    const JSCODE_TO_SESSION = 'https://api.weixin.qq.com/sns/jscode2session';
-
-    /**
-     * JsCode 2 session key.
-     *
-     * @param string $jsCode
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getSessionKey($jsCode)
-    {
-        $params = [
-            'appid' => $this->config['app_id'],
-            'secret' => $this->config['secret'],
-            'js_code' => $jsCode,
-            'grant_type' => 'authorization_code',
-        ];
-
-        return $this->parseJSON('GET', [self::JSCODE_TO_SESSION, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/MiniProgram/Staff/Staff.php b/vendor/overtrue/wechat/src/MiniProgram/Staff/Staff.php
deleted file mode 100644
index 25ab1a4..0000000
--- a/vendor/overtrue/wechat/src/MiniProgram/Staff/Staff.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Staff.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\MiniProgram\Staff;
-
-use EasyWeChat\Staff\Staff as BaseStaff;
-
-class Staff extends BaseStaff
-{
-}
diff --git a/vendor/overtrue/wechat/src/MiniProgram/Stats/Stats.php b/vendor/overtrue/wechat/src/MiniProgram/Stats/Stats.php
deleted file mode 100644
index 76e3520..0000000
--- a/vendor/overtrue/wechat/src/MiniProgram/Stats/Stats.php
+++ /dev/null
@@ -1,191 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Stats.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2017
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\MiniProgram\Stats;
-
-use EasyWeChat\MiniProgram\Core\AbstractMiniProgram;
-
-class Stats extends AbstractMiniProgram
-{
-    const SUMMARY_TREND = 'https://api.weixin.qq.com/datacube/getweanalysisappiddailysummarytrend';
-    const DAILY_VISIT_TREND = 'https://api.weixin.qq.com/datacube/getweanalysisappiddailyvisittrend';
-    const WEEKLY_VISIT_TREND = 'https://api.weixin.qq.com/datacube/getweanalysisappidweeklyvisittrend';
-    const MONTHLY_VISIT_TREND = 'https://api.weixin.qq.com/datacube/getweanalysisappidmonthlyvisittrend';
-    const VISIT_DISTRIBUTION = 'https://api.weixin.qq.com/datacube/getweanalysisappidvisitdistribution';
-    const DAILY_RETAIN_INFO = 'https://api.weixin.qq.com/datacube/getweanalysisappiddailyretaininfo';
-    const WEEKLY_RETAIN_INFO = 'https://api.weixin.qq.com/datacube/getweanalysisappidweeklyretaininfo';
-    const MONTHLY_RETAIN_INFO = 'https://api.weixin.qq.com/datacube/getweanalysisappidmonthlyretaininfo';
-    const VISIT_PAGE = 'https://api.weixin.qq.com/datacube/getweanalysisappidvisitpage';
-    const USER_PORTRAIT = 'https://api.weixin.qq.com/datacube/getweanalysisappiduserportrait';
-
-    /**
-     * Get summary trend.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function summaryTrend($from, $to)
-    {
-        return $this->query(self::SUMMARY_TREND, $from, $to);
-    }
-
-    /**
-     * Get daily visit trend.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function dailyVisitTrend($from, $to)
-    {
-        return $this->query(self::DAILY_VISIT_TREND, $from, $to);
-    }
-
-    /**
-     * Get weekly visit trend.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function weeklyVisitTrend($from, $to)
-    {
-        return $this->query(self::WEEKLY_VISIT_TREND, $from, $to);
-    }
-
-    /**
-     * Get monthly visit trend.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function monthlyVisitTrend($from, $to)
-    {
-        return $this->query(self::MONTHLY_VISIT_TREND, $from, $to);
-    }
-
-    /**
-     * Get visit distribution.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function visitDistribution($from, $to)
-    {
-        return $this->query(self::VISIT_DISTRIBUTION, $from, $to);
-    }
-
-    /**
-     * Get daily retain info.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function dailyRetainInfo($from, $to)
-    {
-        return $this->query(self::DAILY_RETAIN_INFO, $from, $to);
-    }
-
-    /**
-     * Get weekly retain info.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function weeklyRetainInfo($from, $to)
-    {
-        return $this->query(self::WEEKLY_RETAIN_INFO, $from, $to);
-    }
-
-    /**
-     * Get monthly retain info.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function montylyRetainInfo($from, $to)
-    {
-        return $this->query(self::MONTHLY_RETAIN_INFO, $from, $to);
-    }
-
-    /**
-     * Get visit page.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function visitPage($from, $to)
-    {
-        return $this->query(self::VISIT_PAGE, $from, $to);
-    }
-
-    /**
-     * Get user portrait.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function userPortrait($from, $to)
-    {
-        return $this->query(self::USER_PORTRAIT, $from, $to);
-    }
-
-    /**
-     * Unify query.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    protected function query($api, $from, $to)
-    {
-        $params = [
-            'begin_date' => $from,
-            'end_date' => $to,
-        ];
-
-        return $this->parseJSON('json', [$api, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Notice/LICENSE b/vendor/overtrue/wechat/src/Notice/LICENSE
deleted file mode 100644
index c5251b8..0000000
--- a/vendor/overtrue/wechat/src/Notice/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 overtrue <anzhengchao@gmail.com>
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Notice/Notice.php b/vendor/overtrue/wechat/src/Notice/Notice.php
deleted file mode 100644
index 4b2ec3a..0000000
--- a/vendor/overtrue/wechat/src/Notice/Notice.php
+++ /dev/null
@@ -1,271 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Notice.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Notice;
-
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Core\AccessToken;
-use EasyWeChat\Core\Exceptions\InvalidArgumentException;
-
-/**
- * Class Notice.
- */
-class Notice extends AbstractAPI
-{
-    /**
-     * Default color.
-     *
-     * @var string
-     */
-    protected $defaultColor = '#173177';
-
-    /**
-     * Attributes.
-     *
-     * @var array
-     */
-    protected $message = [
-        'touser' => '',
-        'template_id' => '',
-        'url' => '',
-        'data' => [],
-        'miniprogram' => '',
-    ];
-
-    /**
-     * Required attributes.
-     *
-     * @var array
-     */
-    protected $required = ['touser', 'template_id'];
-
-    /**
-     * Message backup.
-     *
-     * @var array
-     */
-    protected $messageBackup;
-
-    const API_SEND_NOTICE = 'https://api.weixin.qq.com/cgi-bin/message/template/send';
-    const API_SET_INDUSTRY = 'https://api.weixin.qq.com/cgi-bin/template/api_set_industry';
-    const API_ADD_TEMPLATE = 'https://api.weixin.qq.com/cgi-bin/template/api_add_template';
-    const API_GET_INDUSTRY = 'https://api.weixin.qq.com/cgi-bin/template/get_industry';
-    const API_GET_ALL_PRIVATE_TEMPLATE = 'https://api.weixin.qq.com/cgi-bin/template/get_all_private_template';
-    const API_DEL_PRIVATE_TEMPLATE = 'https://api.weixin.qq.com/cgi-bin/template/del_private_template';
-
-    /**
-     * Notice constructor.
-     *
-     * @param \EasyWeChat\Core\AccessToken $accessToken
-     */
-    public function __construct(AccessToken $accessToken)
-    {
-        parent::__construct($accessToken);
-
-        $this->messageBackup = $this->message;
-    }
-
-    /**
-     * Set default color.
-     *
-     * @param string $color example: #0f0f0f
-     *
-     * @return $this
-     */
-    public function defaultColor($color)
-    {
-        $this->defaultColor = $color;
-
-        return $this;
-    }
-
-    /**
-     * Set industry.
-     *
-     * @param int $industryOne
-     * @param int $industryTwo
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function setIndustry($industryOne, $industryTwo)
-    {
-        $params = [
-                   'industry_id1' => $industryOne,
-                   'industry_id2' => $industryTwo,
-                  ];
-
-        return $this->parseJSON('json', [self::API_SET_INDUSTRY, $params]);
-    }
-
-    /**
-     * Get industry.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getIndustry()
-    {
-        return $this->parseJSON('json', [self::API_GET_INDUSTRY]);
-    }
-
-    /**
-     * Add a template and get template ID.
-     *
-     * @param string $shortId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function addTemplate($shortId)
-    {
-        $params = ['template_id_short' => $shortId];
-
-        return $this->parseJSON('json', [self::API_ADD_TEMPLATE, $params]);
-    }
-
-    /**
-     * Get private templates.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getPrivateTemplates()
-    {
-        return $this->parseJSON('json', [self::API_GET_ALL_PRIVATE_TEMPLATE]);
-    }
-
-    /**
-     * Delete private template.
-     *
-     * @param string $templateId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function deletePrivateTemplate($templateId)
-    {
-        $params = ['template_id' => $templateId];
-
-        return $this->parseJSON('json', [self::API_DEL_PRIVATE_TEMPLATE, $params]);
-    }
-
-    /**
-     * Send a notice message.
-     *
-     * @param $data
-     *
-     * @return \EasyWeChat\Support\Collection
-     *
-     * @throws \EasyWeChat\Core\Exceptions\InvalidArgumentException
-     */
-    public function send($data = [])
-    {
-        $params = array_merge($this->message, $data);
-
-        foreach ($params as $key => $value) {
-            if (in_array($key, $this->required, true) && empty($value) && empty($this->message[$key])) {
-                throw new InvalidArgumentException("Attribute '$key' can not be empty!");
-            }
-
-            $params[$key] = empty($value) ? $this->message[$key] : $value;
-        }
-
-        $params['data'] = $this->formatData($params['data']);
-
-        $this->message = $this->messageBackup;
-
-        return $this->parseJSON('json', [static::API_SEND_NOTICE, $params]);
-    }
-
-    /**
-     * Magic access..
-     *
-     * @param string $method
-     * @param array  $args
-     *
-     * @return Notice
-     */
-    public function __call($method, $args)
-    {
-        $map = [
-                'template' => 'template_id',
-                'templateId' => 'template_id',
-                'uses' => 'template_id',
-                'to' => 'touser',
-                'receiver' => 'touser',
-                'url' => 'url',
-                'link' => 'url',
-                'data' => 'data',
-                'with' => 'data',
-                'formId' => 'form_id',
-                'prepayId' => 'form_id',
-               ];
-
-        if (0 === stripos($method, 'with') && strlen($method) > 4) {
-            $method = lcfirst(substr($method, 4));
-        }
-
-        if (0 === stripos($method, 'and')) {
-            $method = lcfirst(substr($method, 3));
-        }
-
-        if (isset($map[$method])) {
-            $this->message[$map[$method]] = array_shift($args);
-        }
-
-        return $this;
-    }
-
-    /**
-     * Format template data.
-     *
-     * @param array $data
-     *
-     * @return array
-     */
-    protected function formatData($data)
-    {
-        $return = [];
-
-        foreach ($data as $key => $item) {
-            if (is_scalar($item)) {
-                $value = $item;
-                $color = $this->defaultColor;
-            } elseif (is_array($item) && !empty($item)) {
-                if (isset($item['value'])) {
-                    $value = strval($item['value']);
-                    $color = empty($item['color']) ? $this->defaultColor : strval($item['color']);
-                } elseif (count($item) < 2) {
-                    $value = array_shift($item);
-                    $color = $this->defaultColor;
-                } else {
-                    list($value, $color) = $item;
-                }
-            } else {
-                $value = 'error data item.';
-                $color = $this->defaultColor;
-            }
-
-            $return[$key] = [
-                'value' => $value,
-                'color' => $color,
-            ];
-        }
-
-        return $return;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Notice/README.md b/vendor/overtrue/wechat/src/Notice/README.md
deleted file mode 100644
index 2d8244a..0000000
--- a/vendor/overtrue/wechat/src/Notice/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# notice
-微信 SDK 模板消息
diff --git a/vendor/overtrue/wechat/src/Notice/composer.json b/vendor/overtrue/wechat/src/Notice/composer.json
deleted file mode 100644
index c595a8c..0000000
--- a/vendor/overtrue/wechat/src/Notice/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/notice",
-    "description": "notice module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "notice", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Notice\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/AccessToken.php b/vendor/overtrue/wechat/src/OpenPlatform/AccessToken.php
deleted file mode 100644
index d3d288d..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/AccessToken.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * AccessToken.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform;
-
-use EasyWeChat\Core\AccessToken as CoreAccessToken;
-use EasyWeChat\Core\Exceptions\HttpException;
-
-class AccessToken extends CoreAccessToken
-{
-    /**
-     * VerifyTicket.
-     *
-     * @var \EasyWeChat\OpenPlatform\VerifyTicket
-     */
-    protected $verifyTicket;
-
-    /**
-     * API.
-     */
-    const API_TOKEN_GET = 'https://api.weixin.qq.com/cgi-bin/component/api_component_token';
-
-    /**
-     * {@inheritdoc}.
-     */
-    protected $queryName = 'component_access_token';
-
-    /**
-     * {@inheritdoc}.
-     */
-    protected $tokenJsonKey = 'component_access_token';
-
-    /**
-     * {@inheritdoc}.
-     */
-    protected $prefix = 'easywechat.open_platform.component_access_token.';
-
-    /**
-     * Set VerifyTicket.
-     *
-     * @param EasyWeChat\OpenPlatform\VerifyTicket $verifyTicket
-     *
-     * @return $this
-     */
-    public function setVerifyTicket(VerifyTicket $verifyTicket)
-    {
-        $this->verifyTicket = $verifyTicket;
-
-        return $this;
-    }
-
-    /**
-     * {@inheritdoc}.
-     */
-    public function getTokenFromServer()
-    {
-        $data = [
-            'component_appid' => $this->appId,
-            'component_appsecret' => $this->secret,
-            'component_verify_ticket' => $this->verifyTicket->getTicket(),
-        ];
-
-        $http = $this->getHttp();
-
-        $token = $http->parseJSON($http->json(self::API_TOKEN_GET, $data));
-
-        if (empty($token[$this->tokenJsonKey])) {
-            throw new HttpException('Request ComponentAccessToken fail. response: '.json_encode($token, JSON_UNESCAPED_UNICODE));
-        }
-
-        return $token;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/Api/AbstractOpenPlatform.php b/vendor/overtrue/wechat/src/OpenPlatform/Api/AbstractOpenPlatform.php
deleted file mode 100644
index 96af9c2..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/Api/AbstractOpenPlatform.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * AbstractOpenPlatform.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @author    lixiao <leonlx126@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform\Api;
-
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\OpenPlatform\AccessToken;
-use Symfony\Component\HttpFoundation\Request;
-
-abstract class AbstractOpenPlatform extends AbstractAPI
-{
-    /**
-     * Request.
-     *
-     * @var \Symfony\Component\HttpFoundation\Request
-     */
-    protected $request;
-
-    /**
-     * AbstractOpenPlatform constructor.
-     *
-     * @param \EasyWeChat\OpenPlatform\AccessToken      $accessToken
-     * @param \Symfony\Component\HttpFoundation\Request $request
-     */
-    public function __construct(AccessToken $accessToken, Request $request)
-    {
-        parent::__construct($accessToken);
-
-        $this->request = $request;
-    }
-
-    /**
-     * Get OpenPlatform AppId.
-     *
-     * @return string
-     */
-    public function getAppId()
-    {
-        return $this->getAccessToken()->getAppId();
-    }
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/Api/BaseApi.php b/vendor/overtrue/wechat/src/OpenPlatform/Api/BaseApi.php
deleted file mode 100644
index e020121..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/Api/BaseApi.php
+++ /dev/null
@@ -1,174 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * BaseApi.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @author    lixiao <leonlx126@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform\Api;
-
-class BaseApi extends AbstractOpenPlatform
-{
-    /**
-     * Get auth info api.
-     */
-    const GET_AUTH_INFO = 'https://api.weixin.qq.com/cgi-bin/component/api_query_auth';
-
-    /**
-     * Get authorizer token api.
-     */
-    const GET_AUTHORIZER_TOKEN = 'https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token';
-
-    /**
-     * Get authorizer info api.
-     */
-    const GET_AUTHORIZER_INFO = 'https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info';
-
-    /**
-     * Get authorizer options api.
-     */
-    const GET_AUTHORIZER_OPTION = 'https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_option';
-
-    /**
-     * Set authorizer options api.
-     */
-    const SET_AUTHORIZER_OPTION = 'https://api.weixin.qq.com/cgi-bin/component/api_set_authorizer_option';
-
-    const GET_AUTHORIZER_LIST = 'https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_list';
-
-    /**
-     * Get authorization info.
-     *
-     * @param $authCode
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getAuthorizationInfo($authCode = null)
-    {
-        $params = [
-            'component_appid' => $this->getAppId(),
-            'authorization_code' => $authCode ?: $this->request->get('auth_code'),
-        ];
-
-        return $this->parseJSON('json', [self::GET_AUTH_INFO, $params]);
-    }
-
-    /**
-     * Get authorizer token.
-     *
-     * It doesn't cache the authorizer-access-token.
-     * So developers should NEVER call this method.
-     * It'll called by: AuthorizerAccessToken::renewAccessToken()
-     *
-     * @param $appId
-     * @param $refreshToken
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getAuthorizerToken($appId, $refreshToken)
-    {
-        $params = [
-            'component_appid' => $this->getAppId(),
-            'authorizer_appid' => $appId,
-            'authorizer_refresh_token' => $refreshToken,
-        ];
-
-        return $this->parseJSON('json', [self::GET_AUTHORIZER_TOKEN, $params]);
-    }
-
-    /**
-     * Get authorizer info.
-     *
-     * @param string $authorizerAppId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getAuthorizerInfo($authorizerAppId)
-    {
-        $params = [
-            'component_appid' => $this->getAppId(),
-            'authorizer_appid' => $authorizerAppId,
-        ];
-
-        return $this->parseJSON('json', [self::GET_AUTHORIZER_INFO, $params]);
-    }
-
-    /**
-     * Get options.
-     *
-     * @param $authorizerAppId
-     * @param $optionName
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getAuthorizerOption($authorizerAppId, $optionName)
-    {
-        $params = [
-            'component_appid' => $this->getAppId(),
-            'authorizer_appid' => $authorizerAppId,
-            'option_name' => $optionName,
-        ];
-
-        return $this->parseJSON('json', [self::GET_AUTHORIZER_OPTION, $params]);
-    }
-
-    /**
-     * Set authorizer option.
-     *
-     * @param $authorizerAppId
-     * @param $optionName
-     * @param $optionValue
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function setAuthorizerOption($authorizerAppId, $optionName, $optionValue)
-    {
-        $params = [
-            'component_appid' => $this->getAppId(),
-            'authorizer_appid' => $authorizerAppId,
-            'option_name' => $optionName,
-            'option_value' => $optionValue,
-        ];
-
-        return $this->parseJSON('json', [self::SET_AUTHORIZER_OPTION, $params]);
-    }
-
-    /**
-     * Get authorizer list.
-     *
-     * @param int $offset
-     * @param int $count
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getAuthorizerList($offset = 0, $count = 500)
-    {
-        $params = [
-            'component_appid' => $this->getAppId(),
-            'offset' => $offset,
-            'count' => $count,
-        ];
-
-        return $this->parseJSON('json', [self::GET_AUTHORIZER_LIST, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/Api/PreAuthorization.php b/vendor/overtrue/wechat/src/OpenPlatform/Api/PreAuthorization.php
deleted file mode 100644
index 6010c5c..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/Api/PreAuthorization.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * PreAuthorization.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @author    lixiao <leonlx126@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform\Api;
-
-use EasyWeChat\Core\Exceptions\InvalidArgumentException;
-use Symfony\Component\HttpFoundation\RedirectResponse;
-
-class PreAuthorization extends AbstractOpenPlatform
-{
-    /**
-     * Create pre auth code url.
-     */
-    const CREATE_PRE_AUTH_CODE = 'https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode';
-
-    /**
-     * Pre auth link.
-     */
-    const PRE_AUTH_LINK = 'https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=%s&pre_auth_code=%s&redirect_uri=%s';
-
-    /**
-     * Get pre auth code.
-     *
-     * @throws \EasyWeChat\Core\Exceptions\InvalidArgumentException
-     *
-     * @return string
-     */
-    public function getCode()
-    {
-        $data = [
-            'component_appid' => $this->getAppId(),
-        ];
-
-        $result = $this->parseJSON('json', [self::CREATE_PRE_AUTH_CODE, $data]);
-
-        if (empty($result['pre_auth_code'])) {
-            throw new InvalidArgumentException('Invalid response.');
-        }
-
-        return $result['pre_auth_code'];
-    }
-
-    /**
-     * Redirect to WeChat PreAuthorization page.
-     *
-     * @param string $url
-     * @param string $preAuthCode
-     *
-     * @return \Symfony\Component\HttpFoundation\RedirectResponse
-     */
-    public function redirect($url, $preAuthCode = null)
-    {
-        return new RedirectResponse(
-            sprintf(self::PRE_AUTH_LINK, $this->getAppId(), $preAuthCode ?: $this->getCode(), urlencode($url))
-        );
-    }
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/Authorizer.php b/vendor/overtrue/wechat/src/OpenPlatform/Authorizer.php
deleted file mode 100644
index 537a775..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/Authorizer.php
+++ /dev/null
@@ -1,199 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Authorizer.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    lixiao <leonlx126@gmail.com>
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform;
-
-use Doctrine\Common\Cache\Cache;
-use EasyWeChat\Core\Exception;
-use EasyWeChat\OpenPlatform\Api\BaseApi;
-
-class Authorizer
-{
-    const CACHE_KEY_ACCESS_TOKEN = 'easywechat.open_platform.authorizer_access_token';
-    const CACHE_KEY_REFRESH_TOKEN = 'easywechat.open_platform.authorizer_refresh_token';
-
-    /**
-     * Cache.
-     *
-     * @var \Doctrine\Common\Cache\Cache
-     */
-    protected $cache;
-
-    /**
-     * Base API.
-     *
-     * @var \EasyWeChat\OpenPlatform\Api\BaseApi
-     */
-    protected $api;
-
-    /**
-     * Authorizer AppId.
-     *
-     * @var string
-     */
-    protected $appId;
-
-    /**
-     * OpenPlatform AppId.
-     *
-     * @var string
-     */
-    protected $openPlatformAppId;
-
-    /**
-     * Authorizer Constructor.
-     *
-     * @param \EasyWeChat\OpenPlatform\Api\BaseApi $api
-     * @param string                               $openPlatformAppId OpenPlatform AppId
-     * @param \Doctrine\Common\Cache\Cache         $cache
-     */
-    public function __construct(BaseApi $api, $openPlatformAppId, Cache $cache)
-    {
-        $this->api = $api;
-        $this->openPlatformAppId = $openPlatformAppId;
-        $this->cache = $cache;
-    }
-
-    /**
-     * Gets the base api.
-     *
-     * @return \EasyWeChat\OpenPlatform\Api\BaseApi
-     */
-    public function getApi()
-    {
-        return $this->api;
-    }
-
-    /**
-     * Sets the authorizer app id.
-     *
-     * @param string $appId
-     *
-     * @return $this
-     */
-    public function setAppId($appId)
-    {
-        $this->appId = $appId;
-
-        return $this;
-    }
-
-    /**
-     * Gets the authorizer app id, or throws if not found.
-     *
-     * @return string
-     *
-     * @throws \EasyWeChat\Core\Exception
-     */
-    public function getAppId()
-    {
-        if (!$this->appId) {
-            throw new Exception(
-                'Authorizer App Id is not present, you may not make the authorizer yet.'
-            );
-        }
-
-        return $this->appId;
-    }
-
-    /**
-     * Saves the authorizer access token in cache.
-     *
-     * @param string $token
-     * @param int    $expires
-     *
-     * @return $this
-     */
-    public function setAccessToken($token, $expires = 7200)
-    {
-        $this->cache->save($this->getAccessTokenCacheKey(), $token, $expires);
-
-        return $this;
-    }
-
-    /**
-     * Gets the authorizer access token.
-     *
-     * @return string
-     */
-    public function getAccessToken()
-    {
-        return $this->cache->fetch($this->getAccessTokenCacheKey());
-    }
-
-    /**
-     * Saves the authorizer refresh token in cache.
-     *
-     * @param string $refreshToken
-     *
-     * @return $this
-     */
-    public function setRefreshToken($refreshToken)
-    {
-        $this->cache->save($this->getRefreshTokenCacheKey(), $refreshToken);
-
-        return $this;
-    }
-
-    /**
-     * Gets the authorizer refresh token.
-     *
-     * @return string
-     *
-     * @throws \EasyWeChat\Core\Exception when refresh token is not present
-     */
-    public function getRefreshToken()
-    {
-        if ($token = $this->cache->fetch($this->getRefreshTokenCacheKey())) {
-            return $token;
-        }
-
-        throw new Exception(
-            'Authorizer Refresh Token is not present, you may not make the authorizer yet.'
-        );
-    }
-
-    /**
-     * Gets the authorizer access token cache key.
-     *
-     * @return string
-     */
-    public function getAccessTokenCacheKey()
-    {
-        return self::CACHE_KEY_ACCESS_TOKEN.'.'.$this->openPlatformAppId.'.'.$this->getAppId();
-    }
-
-    /**
-     * Gets the authorizer refresh token cache key.
-     *
-     * @return string
-     */
-    public function getRefreshTokenCacheKey()
-    {
-        return self::CACHE_KEY_REFRESH_TOKEN.'.'.$this->openPlatformAppId.'.'.$this->getAppId();
-    }
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/AuthorizerAccessToken.php b/vendor/overtrue/wechat/src/OpenPlatform/AuthorizerAccessToken.php
deleted file mode 100644
index 6d3c467..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/AuthorizerAccessToken.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * AuthorizerAccessToken.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    lixiao <leonlx126@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform;
-
-// Don't change the alias name please. I met the issue "name already in use"
-// when used in Laravel project, not sure what is causing it, this is quick
-// solution.
-use EasyWeChat\Core\AccessToken as BaseAccessToken;
-
-/**
- * Class AuthorizerAccessToken.
- *
- * AuthorizerAccessToken is responsible for the access token of the authorizer,
- * the complexity is that this access token also requires the refresh token
- * of the authorizer which is acquired by the open platform authorizer process.
- *
- * This completely overrides the original AccessToken.
- */
-class AuthorizerAccessToken extends BaseAccessToken
-{
-    /**
-     * @var \EasyWeChat\OpenPlatform\Authorizer
-     */
-    protected $authorizer;
-
-    /**
-     * AuthorizerAccessToken constructor.
-     *
-     * @param string                              $appId
-     * @param \EasyWeChat\OpenPlatform\Authorizer $authorizer
-     */
-    public function __construct($appId, Authorizer $authorizer)
-    {
-        parent::__construct($appId, null);
-
-        $this->authorizer = $authorizer;
-    }
-
-    /**
-     * Get token from WeChat API.
-     *
-     * @param bool $forceRefresh
-     *
-     * @return string
-     */
-    public function getToken($forceRefresh = false)
-    {
-        $cached = $this->authorizer->getAccessToken();
-
-        if ($forceRefresh || empty($cached)) {
-            return $this->renewAccessToken();
-        }
-
-        return $cached;
-    }
-
-    /**
-     * Refresh authorizer access token.
-     *
-     * @return string
-     */
-    protected function renewAccessToken()
-    {
-        $token = $this->authorizer->getApi()
-            ->getAuthorizerToken(
-                $this->authorizer->getAppId(),
-                $this->authorizer->getRefreshToken()
-            );
-
-        $this->authorizer->setAccessToken($token['authorizer_access_token'], $token['expires_in'] - 1500);
-
-        return $token['authorizer_access_token'];
-    }
-
-    /**
-     * Return the AuthorizerAppId.
-     *
-     * @return string
-     */
-    public function getAppId()
-    {
-        return $this->authorizer->getAppId();
-    }
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/Authorized.php b/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/Authorized.php
deleted file mode 100644
index 0ddec4c..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/Authorized.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Authorized.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @author    lixiao <leonlx126@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform\EventHandlers;
-
-class Authorized extends EventHandler
-{
-    /**
-     * {@inheritdoc}.
-     */
-    public function handle($message)
-    {
-        // Do nothing for the time being.
-    }
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/ComponentVerifyTicket.php b/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/ComponentVerifyTicket.php
deleted file mode 100644
index 17c123f..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/ComponentVerifyTicket.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * ComponentVerifyTicket.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @author    lixiao <leonlx126@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform\EventHandlers;
-
-use EasyWeChat\OpenPlatform\VerifyTicket;
-
-class ComponentVerifyTicket extends EventHandler
-{
-    /**
-     * VerifyTicket.
-     *
-     * @var \EasyWeChat\OpenPlatform\VerifyTicket
-     */
-    protected $verifyTicket;
-
-    /**
-     * Constructor.
-     *
-     * @param \EasyWeChat\OpenPlatform\VerifyTicket $verifyTicket
-     */
-    public function __construct(VerifyTicket $verifyTicket)
-    {
-        $this->verifyTicket = $verifyTicket;
-    }
-
-    /**
-     * {@inheritdoc}.
-     */
-    public function handle($message)
-    {
-        $this->verifyTicket->setTicket($message->get('ComponentVerifyTicket'));
-    }
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/EventHandler.php b/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/EventHandler.php
deleted file mode 100644
index ed5860b..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/EventHandler.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * EventHandler.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @author    lixiao <leonlx126@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform\EventHandlers;
-
-abstract class EventHandler
-{
-    /**
-     * Handle an incoming event message from WeChat server-side.
-     *
-     * @param \EasyWeChat\Support\Collection $message
-     */
-    abstract public function handle($message);
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/Unauthorized.php b/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/Unauthorized.php
deleted file mode 100644
index 0bae5c8..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/Unauthorized.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Unauthorized.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @author    lixiao <leonlx126@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform\EventHandlers;
-
-class Unauthorized extends EventHandler
-{
-    /**
-     * {@inheritdoc}.
-     */
-    public function handle($message)
-    {
-        // Do nothing for the time being.
-    }
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/UpdateAuthorized.php b/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/UpdateAuthorized.php
deleted file mode 100644
index 209c21e..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/EventHandlers/UpdateAuthorized.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * UpdateAuthorized.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @author    lixiao <leonlx126@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform\EventHandlers;
-
-class UpdateAuthorized extends EventHandler
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function handle($message)
-    {
-        // Do nothing for the time being.
-    }
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/Guard.php b/vendor/overtrue/wechat/src/OpenPlatform/Guard.php
deleted file mode 100644
index ee931c3..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/Guard.php
+++ /dev/null
@@ -1,139 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Guard.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @author    lixiao <leonlx126@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform;
-
-use EasyWeChat\Server\Guard as ServerGuard;
-use EasyWeChat\Support\Collection;
-use EasyWeChat\Support\Log;
-use Symfony\Component\HttpFoundation\Response;
-
-class Guard extends ServerGuard
-{
-    const EVENT_AUTHORIZED = 'authorized';
-    const EVENT_UNAUTHORIZED = 'unauthorized';
-    const EVENT_UPDATE_AUTHORIZED = 'updateauthorized';
-    const EVENT_COMPONENT_VERIFY_TICKET = 'component_verify_ticket';
-
-    /**
-     * Event handlers.
-     *
-     * @var \EasyWeChat\Support\Collection
-     */
-    protected $handlers;
-
-    /**
-     * Set handlers.
-     *
-     * @param array $handlers
-     */
-    public function setHandlers(array $handlers)
-    {
-        $this->handlers = new Collection($handlers);
-
-        return $this;
-    }
-
-    /**
-     * Get handlers.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getHandlers()
-    {
-        return $this->handlers;
-    }
-
-    /**
-     * Get handler.
-     *
-     * @param string $type
-     *
-     * @return \EasyWeChat\OpenPlatform\EventHandlers\EventHandler|null
-     */
-    public function getHandler($type)
-    {
-        return $this->handlers->get($type);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function serve()
-    {
-        $message = $this->getMessage();
-
-        // Handle Messages.
-        if (isset($message['MsgType'])) {
-            return parent::serve();
-        }
-
-        Log::debug('OpenPlatform Request received:', [
-            'Method' => $this->request->getMethod(),
-            'URI' => $this->request->getRequestUri(),
-            'Query' => $this->request->getQueryString(),
-            'Protocal' => $this->request->server->get('SERVER_PROTOCOL'),
-            'Content' => $this->request->getContent(),
-        ]);
-
-        // If sees the `auth_code` query parameter in the url, that is,
-        // authorization is successful and it calls back, meanwhile, an
-        // `authorized` event, which also includes the auth code, is sent
-        // from WeChat, and that event will be handled.
-        if ($this->request->get('auth_code')) {
-            return new Response(self::SUCCESS_EMPTY_RESPONSE);
-        }
-
-        $this->handleEventMessage($message);
-
-        return new Response(self::SUCCESS_EMPTY_RESPONSE);
-    }
-
-    /**
-     * Handle event message.
-     *
-     * @param array $message
-     */
-    protected function handleEventMessage(array $message)
-    {
-        Log::debug('OpenPlatform Event Message detail:', $message);
-
-        $message = new Collection($message);
-
-        $infoType = $message->get('InfoType');
-
-        if ($handler = $this->getHandler($infoType)) {
-            $handler->handle($message);
-        } else {
-            Log::notice("No existing handler for '{$infoType}'.");
-        }
-
-        if ($messageHandler = $this->getMessageHandler()) {
-            call_user_func_array($messageHandler, [$message]);
-        }
-    }
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/OpenPlatform.php b/vendor/overtrue/wechat/src/OpenPlatform/OpenPlatform.php
deleted file mode 100644
index 94cdb68..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/OpenPlatform.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * OpenPlatform.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform;
-
-use EasyWeChat\Support\Traits\PrefixedContainer;
-
-/**
- * Class OpenPlatform.
- *
- * @property \EasyWeChat\OpenPlatform\Api\BaseApi $api
- * @property \EasyWeChat\OpenPlatform\Api\PreAuthorization $pre_auth
- * @property \EasyWeChat\OpenPlatform\Guard $server
- * @property \EasyWeChat\OpenPlatform\AccessToken $access_token
- *
- * @method \EasyWeChat\Support\Collection getAuthorizationInfo($authCode = null)
- * @method \EasyWeChat\Support\Collection getAuthorizerInfo($authorizerAppId)
- * @method \EasyWeChat\Support\Collection getAuthorizerOption($authorizerAppId, $optionName)
- * @method \EasyWeChat\Support\Collection setAuthorizerOption($authorizerAppId, $optionName, $optionValue)
- * @method \EasyWeChat\Support\Collection getAuthorizerList($offset = 0, $count = 500)
- */
-class OpenPlatform
-{
-    use PrefixedContainer;
-
-    /**
-     * Create an instance of the EasyWeChat for the given authorizer.
-     *
-     * @param string $appId        Authorizer AppId
-     * @param string $refreshToken Authorizer refresh-token
-     *
-     * @return \EasyWeChat\Foundation\Application
-     */
-    public function createAuthorizerApplication($appId, $refreshToken)
-    {
-        $this->fetch('authorizer', function ($authorizer) use ($appId, $refreshToken) {
-            $authorizer->setAppId($appId);
-            $authorizer->setRefreshToken($refreshToken);
-        });
-
-        return $this->fetch('app', function ($app) {
-            $app['access_token'] = $this->fetch('authorizer_access_token');
-            $app['oauth'] = $this->fetch('oauth');
-            $app['server'] = $this->fetch('server');
-        });
-    }
-
-    /**
-     * Quick access to the base-api.
-     *
-     * @param string $method
-     * @param array  $args
-     *
-     * @return mixed
-     */
-    public function __call($method, $args)
-    {
-        return call_user_func_array([$this->api, $method], $args);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/OpenPlatform/VerifyTicket.php b/vendor/overtrue/wechat/src/OpenPlatform/VerifyTicket.php
deleted file mode 100644
index 2b0d026..0000000
--- a/vendor/overtrue/wechat/src/OpenPlatform/VerifyTicket.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * VerifyTicket.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @author    lixiao <leonlx126@gmail.com>
- * @copyright 2016
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\OpenPlatform;
-
-use Doctrine\Common\Cache\Cache;
-use EasyWeChat\Core\Exceptions\RuntimeException;
-
-class VerifyTicket
-{
-    /**
-     * Cache manager.
-     *
-     * @var \Doctrine\Common\Cache\Cache
-     */
-    protected $cache;
-
-    /**
-     * App Id.
-     *
-     * @var string
-     */
-    protected $appId;
-
-    /**
-     * Cache Key.
-     *
-     * @var string
-     */
-    private $cacheKey;
-
-    /**
-     * Cache key prefix.
-     *
-     * @var string
-     */
-    protected $prefix = 'easywechat.open_platform.component_verify_ticket.';
-
-    /**
-     * VerifyTicket constructor.
-     *
-     * @param string                       $appId
-     * @param \Doctrine\Common\Cache\Cache $cache
-     */
-    public function __construct($appId, Cache $cache)
-    {
-        $this->appId = $appId;
-        $this->cache = $cache;
-    }
-
-    /**
-     * Set component verify ticket to the cache.
-     *
-     * @param string $ticket
-     *
-     * @return bool
-     */
-    public function setTicket($ticket)
-    {
-        return $this->cache->save($this->getCacheKey(), $ticket);
-    }
-
-    /**
-     * Get component verify ticket.
-     *
-     * @return string
-     *
-     * @throws \EasyWeChat\Core\Exceptions\RuntimeException
-     */
-    public function getTicket()
-    {
-        if ($cached = $this->cache->fetch($this->getCacheKey())) {
-            return $cached;
-        }
-
-        throw new RuntimeException('Component verify ticket does not exists.');
-    }
-
-    /**
-     * Set component verify ticket cache key.
-     *
-     * @param string $cacheKey
-     *
-     * @return $this
-     */
-    public function setCacheKey($cacheKey)
-    {
-        $this->cacheKey = $cacheKey;
-
-        return $this;
-    }
-
-    /**
-     * Get component verify ticket cache key.
-     *
-     * @return string $this->cacheKey
-     */
-    public function getCacheKey()
-    {
-        if (is_null($this->cacheKey)) {
-            return $this->prefix.$this->appId;
-        }
-
-        return $this->cacheKey;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/POI/LICENSE b/vendor/overtrue/wechat/src/POI/LICENSE
deleted file mode 100644
index c5251b8..0000000
--- a/vendor/overtrue/wechat/src/POI/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 overtrue <anzhengchao@gmail.com>
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/POI/POI.php b/vendor/overtrue/wechat/src/POI/POI.php
deleted file mode 100644
index 8e6797f..0000000
--- a/vendor/overtrue/wechat/src/POI/POI.php
+++ /dev/null
@@ -1,136 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * POI.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\POI;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class POI.
- */
-class POI extends AbstractAPI
-{
-    const API_CREATE = 'https://api.weixin.qq.com/cgi-bin/poi/addpoi';
-    const API_GET = 'https://api.weixin.qq.com/cgi-bin/poi/getpoi';
-    const API_LIST = 'https://api.weixin.qq.com/cgi-bin/poi/getpoilist';
-    const API_UPDATE = 'https://api.weixin.qq.com/cgi-bin/poi/updatepoi';
-    const API_DELETE = 'https://api.weixin.qq.com/cgi-bin/poi/delpoi';
-    const API_GET_CATEGORIES = 'https://api.weixin.qq.com/cgi-bin/poi/getwxcategory';
-
-    /**
-     * Get POI supported categories.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getCategories()
-    {
-        return $this->parseJSON('get', [self::API_GET_CATEGORIES]);
-    }
-
-    /**
-     * Get POI by ID.
-     *
-     * @param int $poiId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function get($poiId)
-    {
-        return $this->parseJSON('json', [self::API_GET, ['poi_id' => $poiId]]);
-    }
-
-    /**
-     * List POI.
-     *
-     * @param int $offset
-     * @param int $limit
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function lists($offset = 0, $limit = 10)
-    {
-        $params = [
-                   'begin' => $offset,
-                   'limit' => $limit,
-                  ];
-
-        return $this->parseJSON('json', [self::API_LIST, $params]);
-    }
-
-    /**
-     * Create a POI.
-     *
-     * @param array $data
-     *
-     * @return bool
-     */
-    public function create(array $data)
-    {
-        $params = [
-                   'business' => ['base_info' => $data],
-                  ];
-
-        return $this->parseJSON('json', [self::API_CREATE, $params]);
-    }
-
-    /**
-     * @param array $data
-     *
-     * @return int
-     */
-    public function createAndGetId(array $data)
-    {
-        return $this->create($data)['poi_id'];
-    }
-
-    /**
-     * Update a POI.
-     *
-     * @param int   $poiId
-     * @param array $data
-     *
-     * @return bool
-     */
-    public function update($poiId, array $data)
-    {
-        $data = array_merge($data, ['poi_id' => $poiId]);
-
-        $params = [
-                   'business' => ['base_info' => $data],
-                  ];
-
-        return $this->parseJSON('json', [self::API_UPDATE, $params]);
-    }
-
-    /**
-     * Delete a POI.
-     *
-     * @param int $poiId
-     *
-     * @return bool
-     */
-    public function delete($poiId)
-    {
-        $params = ['poi_id' => $poiId];
-
-        return $this->parseJSON('json', [self::API_DELETE, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/POI/README.md b/vendor/overtrue/wechat/src/POI/README.md
deleted file mode 100644
index 3ffb14d..0000000
--- a/vendor/overtrue/wechat/src/POI/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# POI
-微信 SDK 门店模块
diff --git a/vendor/overtrue/wechat/src/POI/composer.json b/vendor/overtrue/wechat/src/POI/composer.json
deleted file mode 100644
index bd23dbd..0000000
--- a/vendor/overtrue/wechat/src/POI/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/poi",
-    "description": "POI module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "POI", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\POI\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/API.php b/vendor/overtrue/wechat/src/Payment/API.php
deleted file mode 100644
index 3f7a809..0000000
--- a/vendor/overtrue/wechat/src/Payment/API.php
+++ /dev/null
@@ -1,564 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * API.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Payment;
-
-use Doctrine\Common\Cache\Cache;
-use Doctrine\Common\Cache\FilesystemCache;
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Core\Exception;
-use EasyWeChat\Support\Collection;
-use EasyWeChat\Support\XML;
-use Psr\Http\Message\ResponseInterface;
-
-/**
- * Class API.
- */
-class API extends AbstractAPI
-{
-    /**
-     * Merchant instance.
-     *
-     * @var Merchant
-     */
-    protected $merchant;
-
-    /**
-     * Sandbox box mode.
-     *
-     * @var bool
-     */
-    protected $sandboxEnabled = false;
-
-    /**
-     * Sandbox sign key.
-     *
-     * @var string
-     */
-    protected $sandboxSignKey;
-
-    /**
-     * Cache.
-     *
-     * @var \Doctrine\Common\Cache\Cache
-     */
-    protected $cache;
-
-    const API_HOST = 'https://api.mch.weixin.qq.com';
-
-    // api
-    const API_PAY_ORDER = '/pay/micropay';
-    const API_PREPARE_ORDER = '/pay/unifiedorder';
-    const API_QUERY = '/pay/orderquery';
-    const API_CLOSE = '/pay/closeorder';
-    const API_REVERSE = '/secapi/pay/reverse';
-    const API_REFUND = '/secapi/pay/refund';
-    const API_QUERY_REFUND = '/pay/refundquery';
-    const API_DOWNLOAD_BILL = '/pay/downloadbill';
-    const API_REPORT = '/payitil/report';
-
-    const API_URL_SHORTEN = 'https://api.mch.weixin.qq.com/tools/shorturl';
-    const API_AUTH_CODE_TO_OPENID = 'https://api.mch.weixin.qq.com/tools/authcodetoopenid';
-    const API_SANDBOX_SIGN_KEY = 'https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey';
-
-    // order id types.
-    const TRANSACTION_ID = 'transaction_id';
-    const OUT_TRADE_NO = 'out_trade_no';
-    const OUT_REFUND_NO = 'out_refund_no';
-    const REFUND_ID = 'refund_id';
-
-    // bill types.
-    const BILL_TYPE_ALL = 'ALL';
-    const BILL_TYPE_SUCCESS = 'SUCCESS';
-    const BILL_TYPE_REFUND = 'REFUND';
-    const BILL_TYPE_REVOKED = 'REVOKED';
-
-    /**
-     * API constructor.
-     *
-     * @param \EasyWeChat\Payment\Merchant      $merchant
-     * @param \Doctrine\Common\Cache\Cache|null $cache
-     */
-    public function __construct(Merchant $merchant, Cache $cache = null)
-    {
-        $this->merchant = $merchant;
-        $this->cache = $cache;
-    }
-
-    /**
-     * Pay the order.
-     *
-     * @param Order $order
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function pay(Order $order)
-    {
-        return $this->request($this->wrapApi(self::API_PAY_ORDER), $order->all());
-    }
-
-    /**
-     * Prepare order to pay.
-     *
-     * @param Order $order
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function prepare(Order $order)
-    {
-        $order->notify_url = $order->get('notify_url', $this->merchant->notify_url);
-        if (is_null($order->spbill_create_ip)) {
-            $order->spbill_create_ip = (Order::NATIVE === $order->trade_type) ? get_server_ip() : get_client_ip();
-        }
-
-        return $this->request($this->wrapApi(self::API_PREPARE_ORDER), $order->all());
-    }
-
-    /**
-     * Query order.
-     *
-     * @param string $orderNo
-     * @param string $type
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function query($orderNo, $type = self::OUT_TRADE_NO)
-    {
-        $params = [
-            $type => $orderNo,
-        ];
-
-        return $this->request($this->wrapApi(self::API_QUERY), $params);
-    }
-
-    /**
-     * Query order by transaction_id.
-     *
-     * @param string $transactionId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function queryByTransactionId($transactionId)
-    {
-        return $this->query($transactionId, self::TRANSACTION_ID);
-    }
-
-    /**
-     * Close order by out_trade_no.
-     *
-     * @param $tradeNo
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function close($tradeNo)
-    {
-        $params = [
-            'out_trade_no' => $tradeNo,
-        ];
-
-        return $this->request($this->wrapApi(self::API_CLOSE), $params);
-    }
-
-    /**
-     * Reverse order.
-     *
-     * @param string $orderNo
-     * @param string $type
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function reverse($orderNo, $type = self::OUT_TRADE_NO)
-    {
-        $params = [
-            $type => $orderNo,
-        ];
-
-        return $this->safeRequest($this->wrapApi(self::API_REVERSE), $params);
-    }
-
-    /**
-     * Reverse order by transaction_id.
-     *
-     * @param int $transactionId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function reverseByTransactionId($transactionId)
-    {
-        return $this->reverse($transactionId, self::TRANSACTION_ID);
-    }
-
-    /**
-     * Make a refund request.
-     *
-     * @param string $orderNo
-     * @param string $refundNo
-     * @param float  $totalFee
-     * @param float  $refundFee
-     * @param string $opUserId
-     * @param string $type
-     * @param string $refundAccount
-     * @param string $refundReason
-     *
-     * @return Collection
-     */
-    public function refund(
-        $orderNo,
-        $refundNo,
-        $totalFee,
-        $refundFee = null,
-        $opUserId = null,
-        $type = self::OUT_TRADE_NO,
-        $refundAccount = 'REFUND_SOURCE_UNSETTLED_FUNDS',
-        $refundReason = ''
-        ) {
-        $params = [
-            $type => $orderNo,
-            'out_refund_no' => $refundNo,
-            'total_fee' => $totalFee,
-            'refund_fee' => $refundFee ?: $totalFee,
-            'refund_fee_type' => $this->merchant->fee_type,
-            'refund_account' => $refundAccount,
-            'refund_desc' => $refundReason,
-            'op_user_id' => $opUserId ?: $this->merchant->merchant_id,
-        ];
-
-        return $this->safeRequest($this->wrapApi(self::API_REFUND), $params);
-    }
-
-    /**
-     * Refund by transaction id.
-     *
-     * @param string $orderNo
-     * @param string $refundNo
-     * @param float  $totalFee
-     * @param float  $refundFee
-     * @param string $opUserId
-     * @param string $refundAccount
-     * @param string $refundReason
-     *
-     * @return Collection
-     */
-    public function refundByTransactionId(
-        $orderNo,
-        $refundNo,
-        $totalFee,
-        $refundFee = null,
-        $opUserId = null,
-        $refundAccount = 'REFUND_SOURCE_UNSETTLED_FUNDS',
-        $refundReason = ''
-        ) {
-        return $this->refund($orderNo, $refundNo, $totalFee, $refundFee, $opUserId, self::TRANSACTION_ID, $refundAccount, $refundReason);
-    }
-
-    /**
-     * Query refund status.
-     *
-     * @param string $orderNo
-     * @param string $type
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function queryRefund($orderNo, $type = self::OUT_TRADE_NO)
-    {
-        $params = [
-            $type => $orderNo,
-        ];
-
-        return $this->request($this->wrapApi(self::API_QUERY_REFUND), $params);
-    }
-
-    /**
-     * Query refund status by out_refund_no.
-     *
-     * @param string $refundNo
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function queryRefundByRefundNo($refundNo)
-    {
-        return $this->queryRefund($refundNo, self::OUT_REFUND_NO);
-    }
-
-    /**
-     * Query refund status by transaction_id.
-     *
-     * @param string $transactionId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function queryRefundByTransactionId($transactionId)
-    {
-        return $this->queryRefund($transactionId, self::TRANSACTION_ID);
-    }
-
-    /**
-     * Query refund status by refund_id.
-     *
-     * @param string $refundId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function queryRefundByRefundId($refundId)
-    {
-        return $this->queryRefund($refundId, self::REFUND_ID);
-    }
-
-    /**
-     * Download bill history as a table file.
-     *
-     * @param string $date
-     * @param string $type
-     *
-     * @return \Psr\Http\Message\ResponseInterface
-     */
-    public function downloadBill($date, $type = self::BILL_TYPE_ALL)
-    {
-        $params = [
-            'bill_date' => $date,
-            'bill_type' => $type,
-        ];
-
-        return $this->request($this->wrapApi(self::API_DOWNLOAD_BILL), $params, 'post', [\GuzzleHttp\RequestOptions::STREAM => true], true)->getBody();
-    }
-
-    /**
-     * Convert long url to short url.
-     *
-     * @param string $url
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function urlShorten($url)
-    {
-        return $this->request(self::API_URL_SHORTEN, ['long_url' => $url]);
-    }
-
-    /**
-     * Report API status to WeChat.
-     *
-     * @param string $api
-     * @param int    $timeConsuming
-     * @param string $resultCode
-     * @param string $returnCode
-     * @param array  $other         ex: err_code,err_code_des,out_trade_no,user_ip...
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function report($api, $timeConsuming, $resultCode, $returnCode, array $other = [])
-    {
-        $params = array_merge([
-            'interface_url' => $api,
-            'execute_time_' => $timeConsuming,
-            'return_code' => $returnCode,
-            'return_msg' => null,
-            'result_code' => $resultCode,
-            'user_ip' => get_client_ip(),
-            'time' => time(),
-        ], $other);
-
-        return $this->request($this->wrapApi(self::API_REPORT), $params);
-    }
-
-    /**
-     * Get openid by auth code.
-     *
-     * @param string $authCode
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function authCodeToOpenId($authCode)
-    {
-        return $this->request(self::API_AUTH_CODE_TO_OPENID, ['auth_code' => $authCode]);
-    }
-
-    /**
-     * Merchant setter.
-     *
-     * @param Merchant $merchant
-     *
-     * @return $this
-     */
-    public function setMerchant(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * Merchant getter.
-     *
-     * @return Merchant
-     */
-    public function getMerchant()
-    {
-        return $this->merchant;
-    }
-
-    /**
-     * Set sandbox mode.
-     *
-     * @param bool $enabled
-     *
-     * @return $this
-     */
-    public function sandboxMode($enabled = false)
-    {
-        $this->sandboxEnabled = $enabled;
-
-        return $this;
-    }
-
-    /**
-     * Make a API request.
-     *
-     * @param string $api
-     * @param array  $params
-     * @param string $method
-     * @param array  $options
-     * @param bool   $returnResponse
-     *
-     * @return \EasyWeChat\Support\Collection|\Psr\Http\Message\ResponseInterface
-     */
-    protected function request($api, array $params, $method = 'post', array $options = [], $returnResponse = false)
-    {
-        $params = array_merge($params, $this->merchant->only(['sub_appid', 'sub_mch_id']));
-
-        $params['appid'] = $this->merchant->app_id;
-        $params['mch_id'] = $this->merchant->merchant_id;
-        $params['device_info'] = $this->merchant->device_info;
-        $params['nonce_str'] = uniqid();
-        $params = array_filter($params);
-
-        $params['sign'] = generate_sign($params, $this->getSignkey($api), 'md5');
-
-        $options = array_merge([
-            'body' => XML::build($params),
-        ], $options);
-
-        $response = $this->getHttp()->request($api, $method, $options);
-
-        return $returnResponse ? $response : $this->parseResponse($response);
-    }
-
-    /**
-     * Return key to sign.
-     *
-     * @param string $api
-     *
-     * @return string
-     */
-    public function getSignkey($api)
-    {
-        return $this->sandboxEnabled && self::API_SANDBOX_SIGN_KEY !== $api ? $this->getSandboxSignKey() : $this->merchant->key;
-    }
-
-    /**
-     * Request with SSL.
-     *
-     * @param string $api
-     * @param array  $params
-     * @param string $method
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    protected function safeRequest($api, array $params, $method = 'post')
-    {
-        $options = [
-            'cert' => $this->merchant->get('cert_path'),
-            'ssl_key' => $this->merchant->get('key_path'),
-        ];
-
-        return $this->request($api, $params, $method, $options);
-    }
-
-    /**
-     * Parse Response XML to array.
-     *
-     * @param ResponseInterface $response
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    protected function parseResponse($response)
-    {
-        if ($response instanceof ResponseInterface) {
-            $response = $response->getBody();
-        }
-
-        return new Collection((array) XML::parse($response));
-    }
-
-    /**
-     * Wrap API.
-     *
-     * @param string $resource
-     *
-     * @return string
-     */
-    protected function wrapApi($resource)
-    {
-        return self::API_HOST.($this->sandboxEnabled ? '/sandboxnew' : '').$resource;
-    }
-
-    /**
-     * Get sandbox sign key.
-     *
-     * @return string
-     */
-    protected function getSandboxSignKey()
-    {
-        if ($this->sandboxSignKey) {
-            return $this->sandboxSignKey;
-        }
-
-        // Try to get sandbox_signkey from cache
-        $cacheKey = 'sandbox_signkey.'.$this->merchant->merchant_id.$this->merchant->sub_merchant_id;
-
-        /** @var \Doctrine\Common\Cache\Cache $cache */
-        $cache = $this->getCache();
-
-        $this->sandboxSignKey = $cache->fetch($cacheKey);
-
-        if (!$this->sandboxSignKey) {
-            // Try to acquire a new sandbox_signkey from WeChat
-            $result = $this->request(self::API_SANDBOX_SIGN_KEY, []);
-
-            if ('SUCCESS' === $result->return_code) {
-                $cache->save($cacheKey, $result->sandbox_signkey, 24 * 3600);
-
-                return $this->sandboxSignKey = $result->sandbox_signkey;
-            }
-
-            throw new Exception($result->return_msg);
-        }
-
-        return $this->sandboxSignKey;
-    }
-
-    /**
-     * Return the cache manager.
-     *
-     * @return \Doctrine\Common\Cache\Cache
-     */
-    public function getCache()
-    {
-        return $this->cache ?: $this->cache = new FilesystemCache(sys_get_temp_dir());
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/CashCoupon/API.php b/vendor/overtrue/wechat/src/Payment/CashCoupon/API.php
deleted file mode 100644
index 77a7afb..0000000
--- a/vendor/overtrue/wechat/src/Payment/CashCoupon/API.php
+++ /dev/null
@@ -1,158 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * API.php.
- *
- * @author    tianyong90 <412039588@qq.com>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Payment\CashCoupon;
-
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Payment\Merchant;
-use EasyWeChat\Support\Collection;
-use EasyWeChat\Support\XML;
-use Psr\Http\Message\ResponseInterface;
-
-/**
- * Class API.
- */
-class API extends AbstractAPI
-{
-    /**
-     * Merchant instance.
-     *
-     * @var Merchant
-     */
-    protected $merchant;
-
-    // api
-    const API_SEND = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/send_coupon';
-    const API_QUERY_STOCK = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/query_coupon_stock';
-    const API_QUERY = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/querycouponsinfo';
-
-    /**
-     * API constructor.
-     *
-     * @param \EasyWeChat\Payment\Merchant $merchant
-     */
-    public function __construct(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * send a cash coupon.
-     *
-     * @param array $params
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function send(array $params)
-    {
-        $params['openid_count'] = 1;
-
-        return $this->request(self::API_SEND, $params);
-    }
-
-    /**
-     * query a coupon stock.
-     *
-     * @param array $params
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function queryStock(array $params)
-    {
-        return $this->request(self::API_QUERY_STOCK, $params);
-    }
-
-    /**
-     * query a info of coupon.
-     *
-     * @param array $params
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function query(array $params)
-    {
-        return $this->request(self::API_QUERY, $params);
-    }
-
-    /**
-     * Merchant setter.
-     *
-     * @param Merchant $merchant
-     *
-     * @return $this
-     */
-    public function setMerchant(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * Merchant getter.
-     *
-     * @return Merchant
-     */
-    public function getMerchant()
-    {
-        return $this->merchant;
-    }
-
-    /**
-     * Make a API request.
-     *
-     * @param string $api
-     * @param array  $params
-     * @param string $method
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    protected function request($api, array $params, $method = 'post')
-    {
-        $params = array_filter($params);
-        $params['mch_id'] = $this->merchant->merchant_id;
-        $params['appid'] = $this->merchant->app_id;
-        $params['nonce_str'] = uniqid();
-        $params['sign'] = \EasyWeChat\Payment\generate_sign($params, $this->merchant->key, 'md5');
-
-        $options = [
-            'body' => XML::build($params),
-            'cert' => $this->merchant->get('cert_path'),
-            'ssl_key' => $this->merchant->get('key_path'),
-        ];
-
-        return $this->parseResponse($this->getHttp()->request($api, $method, $options));
-    }
-
-    /**
-     * Parse Response XML to array.
-     *
-     * @param \Psr\Http\Message\ResponseInterface|string $response
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    protected function parseResponse($response)
-    {
-        if ($response instanceof ResponseInterface) {
-            $response = $response->getBody();
-        }
-
-        return new Collection((array) XML::parse($response));
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/CashCoupon/CashCoupon.php b/vendor/overtrue/wechat/src/Payment/CashCoupon/CashCoupon.php
deleted file mode 100644
index 699575f..0000000
--- a/vendor/overtrue/wechat/src/Payment/CashCoupon/CashCoupon.php
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * LuckyMoney.php.
- *
- * @author    tianyong90 <412039588@qq.com>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Payment\CashCoupon;
-
-use EasyWeChat\Payment\Merchant;
-
-/**
- * Class LuckyMoney.
- */
-class CashCoupon
-{
-    /**
-     * @var API
-     */
-    protected $api;
-
-    /**
-     * Merchant instance.
-     *
-     * @var \EasyWeChat\Payment\Merchant
-     */
-    protected $merchant;
-
-    /**
-     * Constructor.
-     *
-     * @param Merchant $merchant
-     */
-    public function __construct(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * Merchant setter.
-     *
-     * @param Merchant $merchant
-     */
-    public function setMerchant(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * Merchant getter.
-     *
-     * @return Merchant
-     */
-    public function getMerchant()
-    {
-        return $this->merchant;
-    }
-
-    /**
-     * API setter.
-     *
-     * @param API $api
-     */
-    public function setAPI(API $api)
-    {
-        $this->api = $api;
-    }
-
-    /**
-     * Return API instance.
-     *
-     * @return API
-     */
-    public function getAPI()
-    {
-        return $this->api ?: $this->api = new API($this->getMerchant());
-    }
-
-    /**
-     * Magic call.
-     *
-     * @param string $method
-     * @param array  $args
-     *
-     * @return mixed
-     *
-     * @codeCoverageIgnore
-     */
-    public function __call($method, $args)
-    {
-        if (is_callable([$this->getAPI(), $method])) {
-            return call_user_func_array([$this->api, $method], $args);
-        }
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/LICENSE b/vendor/overtrue/wechat/src/Payment/LICENSE
deleted file mode 100644
index 307d3f4..0000000
--- a/vendor/overtrue/wechat/src/Payment/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 wechat-sdk
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Payment/LuckyMoney/API.php b/vendor/overtrue/wechat/src/Payment/LuckyMoney/API.php
deleted file mode 100644
index 51f016a..0000000
--- a/vendor/overtrue/wechat/src/Payment/LuckyMoney/API.php
+++ /dev/null
@@ -1,218 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * API.php.
- *
- * @author    tianyong90 <412039588@qq.com>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Payment\LuckyMoney;
-
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Payment\Merchant;
-use EasyWeChat\Support\Collection;
-use EasyWeChat\Support\XML;
-use Psr\Http\Message\ResponseInterface;
-
-/**
- * Class API.
- */
-class API extends AbstractAPI
-{
-    /**
-     * Merchant instance.
-     *
-     * @var Merchant
-     */
-    protected $merchant;
-
-    // api
-    const API_SEND = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
-    const API_SEND_GROUP = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack';
-    const API_QUERY = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo';
-    const API_PREPARE = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder';
-
-    // LuckyMoney type
-    const TYPE_NORMAL = 'NORMAL';
-    const TYPE_GROUP = 'GROUP';
-
-    // Risk control type.
-    const RISK_NORMAL = 'NORMAL';
-    const RISK_IGN_FREQ_LMT = 'IGN_FREQ_LMT';
-    const RISK_IGN_DAY_LMT = 'IGN_DAY_LMT';
-    const RISK_IGN_FREQ_DAY_LMT = 'IGN_FREQ_DAY_LMT';
-
-    /**
-     * API constructor.
-     *
-     * @param \EasyWeChat\Payment\Merchant $merchant
-     */
-    public function __construct(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * Prepare luckymoney.
-     *
-     * @param array $params
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function prepare(array $params)
-    {
-        $params['wxappid'] = $this->merchant->app_id;
-
-        // XXX: PLEASE DON'T CHANGE THE FOLLOWING LINES.
-        $params['auth_mchid'] = '1000052601';
-        $params['auth_appid'] = 'wxbf42bd79c4391863';
-
-        $params['amt_type'] = 'ALL_RAND';
-
-        return $this->request(self::API_PREPARE, $params);
-    }
-
-    /**
-     * Query luckymoney.
-     *
-     * @param string $mchBillNo
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function query($mchBillNo)
-    {
-        $params = [
-            'appid' => $this->merchant->app_id,
-            'mch_billno' => $mchBillNo,
-            'bill_type' => 'MCHT',
-        ];
-
-        return $this->request(self::API_QUERY, $params);
-    }
-
-    /**
-     * Send LuckyMoney.
-     *
-     * @param array  $params
-     * @param string $type
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function send(array $params, $type = self::TYPE_NORMAL)
-    {
-        $api = (self::TYPE_NORMAL === $type) ? self::API_SEND : self::API_SEND_GROUP;
-
-        $params['wxappid'] = $this->merchant->app_id;
-        //如果类型为分裂红则去掉client_ip参数,否则签名会出错
-        if (self::TYPE_GROUP === $type) {
-            unset($params['client_ip']);
-        }
-
-        return $this->request($api, $params);
-    }
-
-    /**
-     * Send normal LuckyMoney.
-     *
-     * @param array $params
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function sendNormal($params)
-    {
-        $params['total_num'] = 1;
-        $params['client_ip'] = !empty($params['client_ip']) ? $params['client_ip'] : getenv('SERVER_ADDR');
-
-        return $this->send($params, self::TYPE_NORMAL);
-    }
-
-    /**
-     * Send group luckymoney.
-     *
-     * @param array $params
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function sendGroup($params)
-    {
-        $params['amt_type'] = 'ALL_RAND';
-
-        return $this->send($params, self::TYPE_GROUP);
-    }
-
-    /**
-     * Merchant setter.
-     *
-     * @param Merchant $merchant
-     *
-     * @return $this
-     */
-    public function setMerchant(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * Merchant getter.
-     *
-     * @return Merchant
-     */
-    public function getMerchant()
-    {
-        return $this->merchant;
-    }
-
-    /**
-     * Make a API request.
-     *
-     * @param string $api
-     * @param array  $params
-     * @param string $method
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    protected function request($api, array $params, $method = 'post')
-    {
-        $params = array_filter($params);
-        $params['mch_id'] = $this->merchant->merchant_id;
-        $params['nonce_str'] = uniqid();
-        $params['sign'] = \EasyWeChat\Payment\generate_sign($params, $this->merchant->key, 'md5');
-
-        $options = [
-            'body' => XML::build($params),
-            'cert' => $this->merchant->get('cert_path'),
-            'ssl_key' => $this->merchant->get('key_path'),
-        ];
-
-        return $this->parseResponse($this->getHttp()->request($api, $method, $options));
-    }
-
-    /**
-     * Parse Response XML to array.
-     *
-     * @param \Psr\Http\Message\ResponseInterface|string $response
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    protected function parseResponse($response)
-    {
-        if ($response instanceof ResponseInterface) {
-            $response = $response->getBody();
-        }
-
-        return new Collection((array) XML::parse($response));
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/LuckyMoney/LuckyMoney.php b/vendor/overtrue/wechat/src/Payment/LuckyMoney/LuckyMoney.php
deleted file mode 100644
index 4ad9be4..0000000
--- a/vendor/overtrue/wechat/src/Payment/LuckyMoney/LuckyMoney.php
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * LuckyMoney.php.
- *
- * @author    tianyong90 <412039588@qq.com>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Payment\LuckyMoney;
-
-use EasyWeChat\Payment\Merchant;
-
-/**
- * Class LuckyMoney.
- */
-class LuckyMoney
-{
-    /**
-     * @var API
-     */
-    protected $api;
-
-    /**
-     * Merchant instance.
-     *
-     * @var \EasyWeChat\Payment\Merchant
-     */
-    protected $merchant;
-
-    /**
-     * Constructor.
-     *
-     * @param Merchant $merchant
-     */
-    public function __construct(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * Merchant setter.
-     *
-     * @param Merchant $merchant
-     */
-    public function setMerchant(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * Merchant getter.
-     *
-     * @return Merchant
-     */
-    public function getMerchant()
-    {
-        return $this->merchant;
-    }
-
-    /**
-     * API setter.
-     *
-     * @param API $api
-     */
-    public function setAPI(API $api)
-    {
-        $this->api = $api;
-    }
-
-    /**
-     * Return API instance.
-     *
-     * @return API
-     */
-    public function getAPI()
-    {
-        return $this->api ?: $this->api = new API($this->getMerchant());
-    }
-
-    /**
-     * Magic call.
-     *
-     * @param string $method
-     * @param array  $args
-     *
-     * @return mixed
-     *
-     * @codeCoverageIgnore
-     */
-    public function __call($method, $args)
-    {
-        if (is_callable([$this->getAPI(), $method])) {
-            return call_user_func_array([$this->api, $method], $args);
-        }
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/Merchant.php b/vendor/overtrue/wechat/src/Payment/Merchant.php
deleted file mode 100644
index 91e9568..0000000
--- a/vendor/overtrue/wechat/src/Payment/Merchant.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Merchant.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Payment;
-
-use EasyWeChat\Support\Attribute;
-
-/**
- * Class Merchant.
- *
- * @property string $app_id
- * @property string $merchant_id
- * @property string $key
- * @property string $sub_app_id
- * @property string $sub_merchant_id
- * @property string $ssl_cert_path
- * @property string $ssl_key_path
- * @property string $fee_type
- * @property string $device_info
- */
-class Merchant extends Attribute
-{
-    /**
-     * @var array
-     */
-    protected $attributes = [
-        'app_id',
-        'merchant_id',
-        'key',
-        'sub_app_id',
-        'sub_merchant_id',
-        'ssl_cert_path',
-        'ssl_key_path',
-        'fee_type',
-        'device_info',
-    ];
-
-    /**
-     * Aliases of attributes.
-     *
-     * @var array
-     */
-    protected $aliases = [
-        'app_id' => 'appid',
-        'key' => 'mch_key',
-        'merchant_id' => 'mch_id',
-        'sub_app_id' => 'sub_appid',
-        'sub_merchant_id' => 'sub_mch_id',
-        'cert_path' => 'sslcert_path',
-        'key_path' => 'sslkey_path',
-    ];
-
-    /**
-     * Constructor.
-     *
-     * @param array $attributes
-     */
-    public function __construct(array $attributes)
-    {
-        parent::__construct($attributes);
-
-        $this->with('fee_type', 'CNY');
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/MerchantPay/API.php b/vendor/overtrue/wechat/src/Payment/MerchantPay/API.php
deleted file mode 100644
index 344da6c..0000000
--- a/vendor/overtrue/wechat/src/Payment/MerchantPay/API.php
+++ /dev/null
@@ -1,152 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * API.php.
- *
- * @author    AC <alexever@gmail.com>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Payment\MerchantPay;
-
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Payment\Merchant;
-use EasyWeChat\Support\Collection;
-use EasyWeChat\Support\XML;
-use Psr\Http\Message\ResponseInterface;
-
-/**
- * Class API.
- */
-class API extends AbstractAPI
-{
-    /**
-     * Merchant instance.
-     *
-     * @var Merchant
-     */
-    protected $merchant;
-
-    // api
-    const API_SEND = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
-    const API_QUERY = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo';
-
-    /**
-     * API constructor.
-     *
-     * @param \EasyWeChat\Payment\Merchant $merchant
-     */
-    public function __construct(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * Query MerchantPay.
-     *
-     * @param string $mchBillNo
-     *
-     * @return \EasyWeChat\Support\Collection
-     *
-     * @notice mch_id when query, but mchid when send
-     */
-    public function query($mchBillNo)
-    {
-        $params = [
-            'appid' => $this->merchant->app_id,
-            'mch_id' => $this->merchant->merchant_id,
-            'partner_trade_no' => $mchBillNo,
-        ];
-
-        return $this->request(self::API_QUERY, $params);
-    }
-
-    /**
-     * Send MerchantPay.
-     *
-     * @param array $params
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function send(array $params)
-    {
-        $params['mchid'] = $this->merchant->merchant_id;
-        $params['mch_appid'] = $this->merchant->app_id;
-
-        return $this->request(self::API_SEND, $params);
-    }
-
-    /**
-     * Merchant setter.
-     *
-     * @param Merchant $merchant
-     *
-     * @return $this
-     */
-    public function setMerchant(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * Merchant getter.
-     *
-     * @return Merchant
-     */
-    public function getMerchant()
-    {
-        return $this->merchant;
-    }
-
-    /**
-     * Make a API request.
-     *
-     * @param string $api
-     * @param array  $params
-     * @param string $method
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    protected function request($api, array $params, $method = 'post')
-    {
-        $params = array_filter($params);
-        $params['nonce_str'] = uniqid();
-        $params['sign'] = \EasyWeChat\Payment\generate_sign($params, $this->merchant->key, 'md5');
-
-        $options = [
-            'body' => XML::build($params),
-            'cert' => $this->merchant->get('cert_path'),
-            'ssl_key' => $this->merchant->get('key_path'),
-        ];
-
-        return $this->parseResponse($this->getHttp()->request($api, $method, $options));
-    }
-
-    /**
-     * Parse Response XML to array.
-     *
-     * @param ResponseInterface $response
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    protected function parseResponse($response)
-    {
-        if ($response instanceof ResponseInterface) {
-            $response = $response->getBody();
-        }
-
-        return new Collection((array) XML::parse($response));
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/MerchantPay/MerchantPay.php b/vendor/overtrue/wechat/src/Payment/MerchantPay/MerchantPay.php
deleted file mode 100644
index 43282f5..0000000
--- a/vendor/overtrue/wechat/src/Payment/MerchantPay/MerchantPay.php
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * MerchantPay.php.
- *
- * @author    AC <alexever@gmail.com>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Payment\MerchantPay;
-
-use EasyWeChat\Payment\Merchant;
-
-/**
- * Class MerchantPay.
- */
-class MerchantPay
-{
-    /**
-     * @var API
-     */
-    protected $api;
-
-    /**
-     * Merchant instance.
-     *
-     * @var \EasyWeChat\Payment\Merchant
-     */
-    protected $merchant;
-
-    /**
-     * Constructor.
-     *
-     * @param Merchant $merchant
-     */
-    public function __construct(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * Merchant setter.
-     *
-     * @param Merchant $merchant
-     */
-    public function setMerchant(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * Merchant getter.
-     *
-     * @return Merchant
-     */
-    public function getMerchant()
-    {
-        return $this->merchant;
-    }
-
-    /**
-     * API setter.
-     *
-     * @param API $api
-     */
-    public function setAPI(API $api)
-    {
-        $this->api = $api;
-    }
-
-    /**
-     * Return API instance.
-     *
-     * @return API
-     */
-    public function getAPI()
-    {
-        return $this->api ?: $this->api = new API($this->getMerchant());
-    }
-
-    /**
-     * Magic call.
-     *
-     * @param string $method
-     * @param array  $args
-     *
-     * @return mixed
-     *
-     * @codeCoverageIgnore
-     */
-    public function __call($method, $args)
-    {
-        if (is_callable([$this->getAPI(), $method])) {
-            return call_user_func_array([$this->api, $method], $args);
-        }
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/Notify.php b/vendor/overtrue/wechat/src/Payment/Notify.php
deleted file mode 100644
index 6742fd6..0000000
--- a/vendor/overtrue/wechat/src/Payment/Notify.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Notify.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Payment;
-
-use EasyWeChat\Core\Exceptions\FaultException;
-use EasyWeChat\Support\Collection;
-use EasyWeChat\Support\XML;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Class Notify.
- */
-class Notify
-{
-    /**
-     * Merchant instance.
-     *
-     * @var \EasyWeChat\Payment\Merchant
-     */
-    protected $merchant;
-
-    /**
-     * Request instance.
-     *
-     * @var \Symfony\Component\HttpFoundation\Request
-     */
-    protected $request;
-
-    /**
-     * Payment notify (extract from XML).
-     *
-     * @var Collection
-     */
-    protected $notify;
-
-    /**
-     * Constructor.
-     *
-     * @param Merchant $merchant
-     * @param Request  $request
-     */
-    public function __construct(Merchant $merchant, Request $request = null)
-    {
-        $this->merchant = $merchant;
-        $this->request = $request ?: Request::createFromGlobals();
-    }
-
-    /**
-     * Validate the request params.
-     *
-     * @return bool
-     */
-    public function isValid($signkey)
-    {
-        $localSign = generate_sign($this->getNotify()->except('sign')->all(), $signkey, 'md5');
-
-        return $localSign === $this->getNotify()->get('sign');
-    }
-
-    /**
-     * Return the notify body from request.
-     *
-     * @return \EasyWeChat\Support\Collection
-     *
-     * @throws \EasyWeChat\Core\Exceptions\FaultException
-     */
-    public function getNotify()
-    {
-        if (!empty($this->notify)) {
-            return $this->notify;
-        }
-
-        try {
-            $xml = XML::parse(strval($this->request->getContent()));
-        } catch (\Throwable $t) {
-            throw new FaultException('Invalid request XML: '.$t->getMessage(), 400);
-        } catch (\Exception $e) {
-            throw new FaultException('Invalid request XML: '.$e->getMessage(), 400);
-        }
-
-        if (!is_array($xml) || empty($xml)) {
-            throw new FaultException('Invalid request XML.', 400);
-        }
-
-        return $this->notify = new Collection($xml);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/Order.php b/vendor/overtrue/wechat/src/Payment/Order.php
deleted file mode 100644
index 288c566..0000000
--- a/vendor/overtrue/wechat/src/Payment/Order.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Order.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Payment;
-
-use EasyWeChat\Support\Attribute;
-
-/**
- * Class Order.
- *
- * @property string $body
- * @property string $detail
- * @property string $attach
- * @property string $out_trade_no
- * @property string $fee_type
- * @property string $total_fee
- * @property string $spbill_create_ip
- * @property string $time_start
- * @property string $time_expire
- * @property string $goods_tag
- * @property string $notify_url
- * @property string $trade_type
- * @property string $product_id
- * @property string $limit_pay
- * @property string $openid
- * @property string $sub_openid
- * @property string $auth_code
- */
-class Order extends Attribute
-{
-    const JSAPI = 'JSAPI';
-    const NATIVE = 'NATIVE';
-    const APP = 'APP';
-    const MICROPAY = 'MICROPAY';
-
-    protected $attributes = [
-        'body',
-        'detail',
-        'attach',
-        'out_trade_no',
-        'fee_type',
-        'total_fee',
-        'spbill_create_ip',
-        'time_start',
-        'time_expire',
-        'goods_tag',
-        'notify_url',
-        'trade_type',
-        'product_id',
-        'limit_pay',
-        'openid',
-        'sub_openid',
-        'auth_code',
-    ];
-
-    /**
-     * Constructor.
-     *
-     * @param array $attributes
-     */
-    public function __construct(array $attributes)
-    {
-        parent::__construct($attributes);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/Payment.php b/vendor/overtrue/wechat/src/Payment/Payment.php
deleted file mode 100644
index be79725..0000000
--- a/vendor/overtrue/wechat/src/Payment/Payment.php
+++ /dev/null
@@ -1,389 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Payment.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Payment;
-
-use Doctrine\Common\Cache\Cache;
-use EasyWeChat\Core\Exceptions\FaultException;
-use EasyWeChat\Support\Url as UrlHelper;
-use EasyWeChat\Support\XML;
-use Overtrue\Socialite\AccessTokenInterface;
-use Symfony\Component\HttpFoundation\Response;
-
-/**
- * Class Payment.
- *
- * @mixin API
- */
-class Payment
-{
-    /**
-     * Scheme base path.
-     */
-    const SCHEME_PATH = 'weixin://wxpay/bizpayurl';
-
-    /**
-     * @var API
-     */
-    protected $api;
-
-    /**
-     * Merchant instance.
-     *
-     * @var \EasyWeChat\Payment\Merchant
-     */
-    protected $merchant;
-
-    /**
-     * Cache.
-     *
-     * @var \Doctrine\Common\Cache\Cache
-     */
-    protected $cache;
-
-    /**
-     * Constructor.
-     *
-     * @param \EasyWeChat\Payment\Merchant      $merchant
-     * @param \Doctrine\Common\Cache\Cache|null $cache
-     */
-    public function __construct(Merchant $merchant, Cache $cache = null)
-    {
-        $this->merchant = $merchant;
-        $this->cache = $cache;
-    }
-
-    /**
-     * Build payment scheme for product.
-     *
-     * @param string $productId
-     *
-     * @return string
-     */
-    public function scheme($productId)
-    {
-        $params = [
-            'appid' => $this->merchant->app_id,
-            'mch_id' => $this->merchant->merchant_id,
-            'time_stamp' => time(),
-            'nonce_str' => uniqid(),
-            'product_id' => $productId,
-        ];
-
-        $params['sign'] = generate_sign($params, $this->merchant->key, 'md5');
-
-        return self::SCHEME_PATH.'?'.http_build_query($params);
-    }
-
-    /**
-     * Handle payment notify.
-     *
-     * @param callable $callback
-     *
-     * @return Response
-     */
-    public function handleNotify(callable $callback)
-    {
-        $notify = $this->getNotify();
-        $signkey = $this->getAPI()->getSignkey(null);
-        if (!$notify->isValid($signkey)) {
-            throw new FaultException('Invalid request payloads.', 400);
-        }
-
-        $notify = $notify->getNotify();
-        $successful = 'SUCCESS' === $notify->get('result_code');
-
-        $handleResult = call_user_func_array($callback, [$notify, $successful]);
-
-        if (is_bool($handleResult) && $handleResult) {
-            $response = [
-                'return_code' => 'SUCCESS',
-                'return_msg' => 'OK',
-            ];
-        } else {
-            $response = [
-                'return_code' => 'FAIL',
-                'return_msg' => $handleResult,
-            ];
-        }
-
-        return new Response(XML::build($response));
-    }
-
-    /**
-     * Handle refund notify.
-     *
-     * @param callable $callback
-     *
-     * @return Response
-     */
-    public function handleRefundNotify(callable $callback)
-    {
-        $notify = $this->getRefundNotify()->getNotify();
-        $successful = 'SUCCESS' === $notify->get('return_code');
-
-        $handleResult = call_user_func_array($callback, [$notify, $successful]);
-
-        if (is_bool($handleResult) && $handleResult) {
-            $response = [
-                'return_code' => 'SUCCESS',
-                'return_msg' => 'OK',
-            ];
-        } else {
-            $response = [
-                'return_code' => 'FAIL',
-                'return_msg' => $handleResult,
-            ];
-        }
-
-        return new Response(XML::build($response));
-    }
-
-    /**
-     * Handle native scan notify.
-     * https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4
-     * The callback shall return string of prepay_id or throw an exception.
-     *
-     * @param callable $callback
-     *
-     * @return Response
-     */
-    public function handleScanNotify(callable $callback)
-    {
-        $notify = $this->getNotify();
-        $signkey = $this->getAPI()->getSignkey(null);
-        if (!$notify->isValid($signkey)) {
-            throw new FaultException('Invalid request payloads.', 400);
-        }
-
-        $notify = $notify->getNotify();
-
-        try {
-            $prepayId = call_user_func_array($callback, [$notify->get('product_id'), $notify->get('openid'), $notify]);
-            $response = [
-                'return_code' => 'SUCCESS',
-                'appid' => $this->merchant->app_id,
-                'mch_id' => $this->merchant->merchant_id,
-                'nonce_str' => uniqid(),
-                'prepay_id' => strval($prepayId),
-                'result_code' => 'SUCCESS',
-            ];
-            $response['sign'] = generate_sign($response, $this->merchant->key);
-        } catch (\Exception $e) {
-            $response = [
-                'return_code' => 'SUCCESS',
-                'return_msg' => $e->getCode(),
-                'result_code' => 'FAIL',
-                'err_code_des' => $e->getMessage(),
-            ];
-        }
-
-        return new Response(XML::build($response));
-    }
-
-    /**
-     * [WeixinJSBridge] Generate js config for payment.
-     *
-     * <pre>
-     * WeixinJSBridge.invoke(
-     *  'getBrandWCPayRequest',
-     *  ...
-     * );
-     * </pre>
-     *
-     * @param string $prepayId
-     * @param bool   $json
-     *
-     * @return string|array
-     */
-    public function configForPayment($prepayId, $json = true)
-    {
-        $params = [
-            'appId' => $this->merchant->app_id,
-            'timeStamp' => strval(time()),
-            'nonceStr' => uniqid(),
-            'package' => "prepay_id=$prepayId",
-            'signType' => 'MD5',
-        ];
-
-        $params['paySign'] = generate_sign($params, $this->merchant->key, 'md5');
-
-        return $json ? json_encode($params) : $params;
-    }
-
-    /**
-     * [JSSDK] Generate js config for payment.
-     *
-     * <pre>
-     * wx.chooseWXPay({...});
-     * </pre>
-     *
-     * @param string $prepayId
-     *
-     * @return array|string
-     */
-    public function configForJSSDKPayment($prepayId)
-    {
-        $config = $this->configForPayment($prepayId, false);
-
-        $config['timestamp'] = $config['timeStamp'];
-        unset($config['timeStamp']);
-
-        return $config;
-    }
-
-    /**
-     * Generate app payment parameters.
-     *
-     * @param string $prepayId
-     *
-     * @return array
-     */
-    public function configForAppPayment($prepayId)
-    {
-        $params = [
-            'appid' => $this->merchant->app_id,
-            'partnerid' => $this->merchant->merchant_id,
-            'prepayid' => $prepayId,
-            'noncestr' => uniqid(),
-            'timestamp' => time(),
-            'package' => 'Sign=WXPay',
-        ];
-
-        $params['sign'] = generate_sign($params, $this->merchant->key);
-
-        return $params;
-    }
-
-    /**
-     * Generate js config for share user address.
-     *
-     * @param string|\Overtrue\Socialite\AccessTokenInterface $accessToken
-     * @param bool                                            $json
-     *
-     * @return string|array
-     */
-    public function configForShareAddress($accessToken, $json = true)
-    {
-        if ($accessToken instanceof AccessTokenInterface) {
-            $accessToken = $accessToken->getToken();
-        }
-
-        $params = [
-            'appId' => $this->merchant->app_id,
-            'scope' => 'jsapi_address',
-            'timeStamp' => strval(time()),
-            'nonceStr' => uniqid(),
-            'signType' => 'SHA1',
-        ];
-
-        $signParams = [
-            'appid' => $params['appId'],
-            'url' => UrlHelper::current(),
-            'timestamp' => $params['timeStamp'],
-            'noncestr' => $params['nonceStr'],
-            'accesstoken' => strval($accessToken),
-        ];
-
-        ksort($signParams);
-
-        $params['addrSign'] = sha1(urldecode(http_build_query($signParams)));
-
-        return $json ? json_encode($params) : $params;
-    }
-
-    /**
-     * Merchant setter.
-     *
-     * @param Merchant $merchant
-     */
-    public function setMerchant(Merchant $merchant)
-    {
-        $this->merchant = $merchant;
-    }
-
-    /**
-     * Merchant getter.
-     *
-     * @return Merchant
-     */
-    public function getMerchant()
-    {
-        return $this->merchant;
-    }
-
-    /**
-     * Return Notify instance.
-     *
-     * @return \EasyWeChat\Payment\Notify
-     */
-    public function getNotify()
-    {
-        return new Notify($this->merchant);
-    }
-
-    /**
-     * Return RefundNotify instance.
-     *
-     * @return \EasyWeChat\Payment\RefundNotify
-     */
-    public function getRefundNotify()
-    {
-        return new RefundNotify($this->merchant);
-    }
-
-    /**
-     * API setter.
-     *
-     * @param API $api
-     */
-    public function setAPI(API $api)
-    {
-        $this->api = $api;
-    }
-
-    /**
-     * Return API instance.
-     *
-     * @return API
-     */
-    public function getAPI()
-    {
-        return $this->api ?: $this->api = new API($this->getMerchant(), $this->cache);
-    }
-
-    /**
-     * Magic call.
-     *
-     * @param string $method
-     * @param array  $args
-     *
-     * @return mixed
-     *
-     * @codeCoverageIgnore
-     */
-    public function __call($method, $args)
-    {
-        if (is_callable([$this->getAPI(), $method])) {
-            return call_user_func_array([$this->api, $method], $args);
-        }
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/README.md b/vendor/overtrue/wechat/src/Payment/README.md
deleted file mode 100644
index f63eff3..0000000
--- a/vendor/overtrue/wechat/src/Payment/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# payment
-微信支付
diff --git a/vendor/overtrue/wechat/src/Payment/RefundNotify.php b/vendor/overtrue/wechat/src/Payment/RefundNotify.php
deleted file mode 100644
index 2cd90dd..0000000
--- a/vendor/overtrue/wechat/src/Payment/RefundNotify.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Payment;
-
-use EasyWeChat\Core\Exceptions\FaultException;
-use EasyWeChat\Support\Collection;
-use EasyWeChat\Support\XML;
-use Symfony\Component\HttpFoundation\Request;
-
-class RefundNotify
-{
-    /**
-     * Merchant instance.
-     *
-     * @var \EasyWeChat\Payment\Merchant
-     */
-    protected $merchant;
-
-    /**
-     * Request instance.
-     *
-     * @var \Symfony\Component\HttpFoundation\Request
-     */
-    protected $request;
-
-    /**
-     * Payment notify (extract from XML).
-     *
-     * @var Collection
-     */
-    protected $notify;
-
-    /**
-     * Constructor.
-     *
-     * @param Merchant $merchant
-     * @param Request  $request
-     */
-    public function __construct(Merchant $merchant, Request $request = null)
-    {
-        $this->merchant = $merchant;
-        $this->request = $request ?: Request::createFromGlobals();
-    }
-
-    /**
-     * Return the notify body from request.
-     *
-     * @return \EasyWeChat\Support\Collection
-     *
-     * @throws \EasyWeChat\Core\Exceptions\FaultException
-     */
-    public function getNotify()
-    {
-        if (!empty($this->notify)) {
-            return $this->notify;
-        }
-
-        try {
-            $xml = XML::parse(strval($this->request->getContent()));
-        } catch (\Throwable $t) {
-            throw new FaultException('Invalid request XML: '.$t->getMessage(), 400);
-        } catch (\Exception $e) {
-            throw new FaultException('Invalid request XML: '.$e->getMessage(), 400);
-        }
-
-        if (!is_array($xml) || empty($xml)) {
-            throw new FaultException('Invalid request XML.', 400);
-        }
-
-        $xml['req_info'] = $this->decode($xml['req_info']);
-
-        return $this->notify = new Collection($xml);
-    }
-
-    public function decode($reqInfo)
-    {
-        $ciphertext = base64_decode($reqInfo, true);
-        $key = md5($this->merchant->key);
-        $decrypted = openssl_decrypt($ciphertext, 'aes-256-ecb', $key, OPENSSL_RAW_DATA);
-
-        return XML::parse($decrypted);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/composer.json b/vendor/overtrue/wechat/src/Payment/composer.json
deleted file mode 100644
index b37a2d2..0000000
--- a/vendor/overtrue/wechat/src/Payment/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/payment",
-    "description": "payment module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "payment", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Payment\\": "."
-        },
-        "files": ["helpers.php"]
-    },
-    "require-dev": {
-        "phpunit/phpunit": "~4.0",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Payment/helpers.php b/vendor/overtrue/wechat/src/Payment/helpers.php
deleted file mode 100644
index 4caba44..0000000
--- a/vendor/overtrue/wechat/src/Payment/helpers.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * helpers.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Payment;
-
-/**
- * Generate a signature.
- *
- * @param array  $attributes
- * @param string $key
- * @param string $encryptMethod
- *
- * @return string
- */
-function generate_sign(array $attributes, $key, $encryptMethod = 'md5')
-{
-    ksort($attributes);
-
-    $attributes['key'] = $key;
-
-    return strtoupper(call_user_func_array($encryptMethod, [urldecode(http_build_query($attributes))]));
-}
-
-/**
- * Get client ip.
- *
- * @return string
- */
-function get_client_ip()
-{
-    if (!empty($_SERVER['REMOTE_ADDR'])) {
-        $ip = $_SERVER['REMOTE_ADDR'];
-    } else {
-        // for php-cli(phpunit etc.)
-        $ip = defined('PHPUNIT_RUNNING') ? '127.0.0.1' : gethostbyname(gethostname());
-    }
-
-    return filter_var($ip, FILTER_VALIDATE_IP) ?: '127.0.0.1';
-}
-
-/**
- * Get current server ip.
- *
- * @return string
- */
-function get_server_ip()
-{
-    if (!empty($_SERVER['SERVER_ADDR'])) {
-        $ip = $_SERVER['SERVER_ADDR'];
-    } elseif (!empty($_SERVER['SERVER_NAME'])) {
-        $ip = gethostbyname($_SERVER['SERVER_NAME']);
-    } else {
-        // for php-cli(phpunit etc.)
-        $ip = defined('PHPUNIT_RUNNING') ? '127.0.0.1' : gethostbyname(gethostname());
-    }
-
-    return filter_var($ip, FILTER_VALIDATE_IP) ?: '127.0.0.1';
-}
diff --git a/vendor/overtrue/wechat/src/QRCode/LICENSE b/vendor/overtrue/wechat/src/QRCode/LICENSE
deleted file mode 100644
index 3a1dc92..0000000
--- a/vendor/overtrue/wechat/src/QRCode/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Easy WeChat
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/QRCode/QRCode.php b/vendor/overtrue/wechat/src/QRCode/QRCode.php
deleted file mode 100644
index 11fc334..0000000
--- a/vendor/overtrue/wechat/src/QRCode/QRCode.php
+++ /dev/null
@@ -1,144 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * QRCode.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\QRCode;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class QRCode.
- */
-class QRCode extends AbstractAPI
-{
-    const DAY = 86400;
-    const SCENE_MAX_VALUE = 100000;
-    const SCENE_QR_CARD = 'QR_CARD';
-    const SCENE_QR_TEMPORARY = 'QR_SCENE';
-    const SCENE_QR_TEMPORARY_STR = 'QR_STR_SCENE';
-    const SCENE_QR_FOREVER = 'QR_LIMIT_SCENE';
-    const SCENE_QR_FOREVER_STR = 'QR_LIMIT_STR_SCENE';
-
-    const API_CREATE = 'https://api.weixin.qq.com/cgi-bin/qrcode/create';
-    const API_SHOW = 'https://mp.weixin.qq.com/cgi-bin/showqrcode';
-
-    /**
-     * Create forever.
-     *
-     * @param int $sceneValue
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function forever($sceneValue)
-    {
-        if (is_int($sceneValue) && $sceneValue > 0 && $sceneValue < self::SCENE_MAX_VALUE) {
-            $type = self::SCENE_QR_FOREVER;
-            $sceneKey = 'scene_id';
-        } else {
-            $type = self::SCENE_QR_FOREVER_STR;
-            $sceneKey = 'scene_str';
-        }
-
-        $scene = [$sceneKey => $sceneValue];
-
-        return $this->create($type, $scene, false);
-    }
-
-    /**
-     * Create temporary.
-     *
-     * @param string $sceneValue
-     * @param null   $expireSeconds
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function temporary($sceneValue, $expireSeconds = null)
-    {
-        if (is_int($sceneValue) && $sceneValue > 0) {
-            $type = self::SCENE_QR_TEMPORARY;
-            $sceneKey = 'scene_id';
-        } else {
-            $type = self::SCENE_QR_TEMPORARY_STR;
-            $sceneKey = 'scene_str';
-        }
-
-        $scene = [$sceneKey => $sceneValue];
-
-        return $this->create($type, $scene, true, $expireSeconds);
-    }
-
-    /**
-     * Create QRCode for card.
-     *
-     * @param array $card
-     *
-     * {
-     *    "card_id": "pFS7Fjg8kV1IdDz01r4SQwMkuCKc",
-     *    "code": "198374613512",
-     *    "openid": "oFS7Fjl0WsZ9AMZqrI80nbIq8xrA",
-     *    "expire_seconds": "1800",
-     *    "is_unique_code": false , "outer_id" : 1
-     *  }
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function card($card)
-    {
-        return $this->create(self::SCENE_QR_CARD, ['card' => $card]);
-    }
-
-    /**
-     * Return url for ticket.
-     *
-     * @param string $ticket
-     *
-     * @return string
-     */
-    public function url($ticket)
-    {
-        return self::API_SHOW."?ticket={$ticket}";
-    }
-
-    /**
-     * Create a QRCode.
-     *
-     * @param string $actionName
-     * @param array  $actionInfo
-     * @param bool   $temporary
-     * @param int    $expireSeconds
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    protected function create($actionName, $actionInfo, $temporary = true, $expireSeconds = null)
-    {
-        null !== $expireSeconds || $expireSeconds = 7 * self::DAY;
-
-        $params = [
-                   'action_name' => $actionName,
-                   'action_info' => ['scene' => $actionInfo],
-                  ];
-
-        if ($temporary) {
-            $params['expire_seconds'] = min($expireSeconds, 30 * self::DAY);
-        }
-
-        return $this->parseJSON('json', [self::API_CREATE, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/QRCode/README.md b/vendor/overtrue/wechat/src/QRCode/README.md
deleted file mode 100644
index e56367f..0000000
--- a/vendor/overtrue/wechat/src/QRCode/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# qrcode
-微信SDK 二维码模块
diff --git a/vendor/overtrue/wechat/src/QRCode/composer.json b/vendor/overtrue/wechat/src/QRCode/composer.json
deleted file mode 100644
index 1c01852..0000000
--- a/vendor/overtrue/wechat/src/QRCode/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/qrcode",
-    "description": "qrcode module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "qrcode", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\QRCode\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Reply/LICENSE b/vendor/overtrue/wechat/src/Reply/LICENSE
deleted file mode 100644
index 3a1dc92..0000000
--- a/vendor/overtrue/wechat/src/Reply/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Easy WeChat
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Reply/README.md b/vendor/overtrue/wechat/src/Reply/README.md
deleted file mode 100644
index 45b0102..0000000
--- a/vendor/overtrue/wechat/src/Reply/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Reply
-微信 SDK 自动回复模块
diff --git a/vendor/overtrue/wechat/src/Reply/Reply.php b/vendor/overtrue/wechat/src/Reply/Reply.php
deleted file mode 100644
index abfcbb8..0000000
--- a/vendor/overtrue/wechat/src/Reply/Reply.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Reply.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Reply;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class Reply.
- */
-class Reply extends AbstractAPI
-{
-    const API_GET_CURRENT_SETTING = 'https://api.weixin.qq.com/cgi-bin/get_current_autoreply_info';
-
-    /**
-     * Get current auto reply settings.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function current()
-    {
-        return $this->parseJSON('get', [self::API_GET_CURRENT_SETTING]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Reply/composer.json b/vendor/overtrue/wechat/src/Reply/composer.json
deleted file mode 100644
index 3917bc5..0000000
--- a/vendor/overtrue/wechat/src/Reply/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/reply",
-    "description": "reply module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Reply\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Semantic/LICENSE b/vendor/overtrue/wechat/src/Semantic/LICENSE
deleted file mode 100644
index 3a1dc92..0000000
--- a/vendor/overtrue/wechat/src/Semantic/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Easy WeChat
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Semantic/README.md b/vendor/overtrue/wechat/src/Semantic/README.md
deleted file mode 100644
index 69b6baa..0000000
--- a/vendor/overtrue/wechat/src/Semantic/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# semantic
-微信SDK 语义理解模块
diff --git a/vendor/overtrue/wechat/src/Semantic/Semantic.php b/vendor/overtrue/wechat/src/Semantic/Semantic.php
deleted file mode 100644
index 4ddf3ea..0000000
--- a/vendor/overtrue/wechat/src/Semantic/Semantic.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Semantic.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Semantic;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class Semantic.
- */
-class Semantic extends AbstractAPI
-{
-    const API_SEARCH = 'https://api.weixin.qq.com/semantic/semproxy/search';
-
-    /**
-     * Get the semantic content of giving string.
-     *
-     * @param string       $keyword
-     * @param array|string $categories
-     * @param array        $other
-     *
-     * @return array
-     */
-    public function query($keyword, $categories, array $other = [])
-    {
-        $params = [
-                   'query' => $keyword,
-                   'category' => implode(',', (array) $categories),
-                   'appid' => $this->getAccessToken()->getAppId(),
-                  ];
-
-        return $this->parseJSON('json', [self::API_SEARCH, array_merge($params, $other)]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Semantic/composer.json b/vendor/overtrue/wechat/src/Semantic/composer.json
deleted file mode 100644
index c15a612..0000000
--- a/vendor/overtrue/wechat/src/Semantic/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/semantic",
-    "description": "semantic module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "semantic", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Semantic\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Server/BadRequestException.php b/vendor/overtrue/wechat/src/Server/BadRequestException.php
deleted file mode 100644
index 6856aa3..0000000
--- a/vendor/overtrue/wechat/src/Server/BadRequestException.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * BadRequestException.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Server;
-
-use EasyWeChat\Core\Exception;
-
-/**
- * Class BadRequestException.
- */
-class BadRequestException extends Exception
-{
-}
diff --git a/vendor/overtrue/wechat/src/Server/Guard.php b/vendor/overtrue/wechat/src/Server/Guard.php
deleted file mode 100644
index fe88dbe..0000000
--- a/vendor/overtrue/wechat/src/Server/Guard.php
+++ /dev/null
@@ -1,498 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Guard.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Server;
-
-use EasyWeChat\Core\Exceptions\FaultException;
-use EasyWeChat\Core\Exceptions\InvalidArgumentException;
-use EasyWeChat\Core\Exceptions\RuntimeException;
-use EasyWeChat\Encryption\Encryptor;
-use EasyWeChat\Message\AbstractMessage;
-use EasyWeChat\Message\Raw as RawMessage;
-use EasyWeChat\Message\Text;
-use EasyWeChat\Support\Collection;
-use EasyWeChat\Support\Log;
-use EasyWeChat\Support\XML;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\Response;
-
-/**
- * Class Guard.
- */
-class Guard
-{
-    /**
-     * Empty string.
-     */
-    const SUCCESS_EMPTY_RESPONSE = 'success';
-
-    const TEXT_MSG = 2;
-    const IMAGE_MSG = 4;
-    const VOICE_MSG = 8;
-    const VIDEO_MSG = 16;
-    const SHORT_VIDEO_MSG = 32;
-    const LOCATION_MSG = 64;
-    const LINK_MSG = 128;
-    const DEVICE_EVENT_MSG = 256;
-    const DEVICE_TEXT_MSG = 512;
-    const FILE_MSG = 1024;
-    const EVENT_MSG = 1048576;
-    const ALL_MSG = 1050622;
-
-    /**
-     * @var Request
-     */
-    protected $request;
-
-    /**
-     * @var string
-     */
-    protected $token;
-
-    /**
-     * @var Encryptor
-     */
-    protected $encryptor;
-
-    /**
-     * @var string|callable
-     */
-    protected $messageHandler;
-
-    /**
-     * @var int
-     */
-    protected $messageFilter;
-
-    /**
-     * @var array
-     */
-    protected $messageTypeMapping = [
-        'text' => 2,
-        'image' => 4,
-        'voice' => 8,
-        'video' => 16,
-        'shortvideo' => 32,
-        'location' => 64,
-        'link' => 128,
-        'device_event' => 256,
-        'device_text' => 512,
-        'file' => 1024,
-        'event' => 1048576,
-    ];
-
-    /**
-     * @var bool
-     */
-    protected $debug = false;
-
-    /**
-     * Constructor.
-     *
-     * @param string  $token
-     * @param Request $request
-     */
-    public function __construct($token, Request $request = null)
-    {
-        $this->token = $token;
-        $this->request = $request ?: Request::createFromGlobals();
-    }
-
-    /**
-     * Enable/Disable debug mode.
-     *
-     * @param bool $debug
-     *
-     * @return $this
-     */
-    public function debug($debug = true)
-    {
-        $this->debug = $debug;
-
-        return $this;
-    }
-
-    /**
-     * Handle and return response.
-     *
-     * @return Response
-     *
-     * @throws BadRequestException
-     */
-    public function serve()
-    {
-        Log::debug('Request received:', [
-            'Method' => $this->request->getMethod(),
-            'URI' => $this->request->getRequestUri(),
-            'Query' => $this->request->getQueryString(),
-            'Protocal' => $this->request->server->get('SERVER_PROTOCOL'),
-            'Content' => $this->request->getContent(),
-        ]);
-
-        $this->validate($this->token);
-
-        if ($str = $this->request->get('echostr')) {
-            Log::debug("Output 'echostr' is '$str'.");
-
-            return new Response($str);
-        }
-
-        $result = $this->handleRequest();
-
-        $response = $this->buildResponse($result['to'], $result['from'], $result['response']);
-
-        Log::debug('Server response created:', compact('response'));
-
-        return new Response($response);
-    }
-
-    /**
-     * Validation request params.
-     *
-     * @param string $token
-     *
-     * @throws FaultException
-     */
-    public function validate($token)
-    {
-        $params = [
-            $token,
-            $this->request->get('timestamp'),
-            $this->request->get('nonce'),
-        ];
-
-        if (!$this->debug && $this->request->get('signature') !== $this->signature($params)) {
-            throw new FaultException('Invalid request signature.', 400);
-        }
-    }
-
-    /**
-     * Add a event listener.
-     *
-     * @param callable $callback
-     * @param int      $option
-     *
-     * @return Guard
-     *
-     * @throws InvalidArgumentException
-     */
-    public function setMessageHandler($callback = null, $option = self::ALL_MSG)
-    {
-        if (!is_callable($callback)) {
-            throw new InvalidArgumentException('Argument #2 is not callable.');
-        }
-
-        $this->messageHandler = $callback;
-        $this->messageFilter = $option;
-
-        return $this;
-    }
-
-    /**
-     * Return the message listener.
-     *
-     * @return string
-     */
-    public function getMessageHandler()
-    {
-        return $this->messageHandler;
-    }
-
-    /**
-     * Request getter.
-     *
-     * @return Request
-     */
-    public function getRequest()
-    {
-        return $this->request;
-    }
-
-    /**
-     * Request setter.
-     *
-     * @param Request $request
-     *
-     * @return $this
-     */
-    public function setRequest(Request $request)
-    {
-        $this->request = $request;
-
-        return $this;
-    }
-
-    /**
-     * Set Encryptor.
-     *
-     * @param Encryptor $encryptor
-     *
-     * @return Guard
-     */
-    public function setEncryptor(Encryptor $encryptor)
-    {
-        $this->encryptor = $encryptor;
-
-        return $this;
-    }
-
-    /**
-     * Return the encryptor instance.
-     *
-     * @return Encryptor
-     */
-    public function getEncryptor()
-    {
-        return $this->encryptor;
-    }
-
-    /**
-     * Build response.
-     *
-     * @param $to
-     * @param $from
-     * @param mixed $message
-     *
-     * @return string
-     *
-     * @throws \EasyWeChat\Core\Exceptions\InvalidArgumentException
-     */
-    protected function buildResponse($to, $from, $message)
-    {
-        if (empty($message) || self::SUCCESS_EMPTY_RESPONSE === $message) {
-            return self::SUCCESS_EMPTY_RESPONSE;
-        }
-
-        if ($message instanceof RawMessage) {
-            return $message->get('content', self::SUCCESS_EMPTY_RESPONSE);
-        }
-
-        if (is_string($message) || is_numeric($message)) {
-            $message = new Text(['content' => $message]);
-        }
-
-        if (!$this->isMessage($message)) {
-            $messageType = gettype($message);
-
-            throw new InvalidArgumentException("Invalid Message type .'{$messageType}'");
-        }
-
-        $response = $this->buildReply($to, $from, $message);
-
-        if ($this->isSafeMode()) {
-            Log::debug('Message safe mode is enable.');
-            $response = $this->encryptor->encryptMsg(
-                $response,
-                $this->request->get('nonce'),
-                $this->request->get('timestamp')
-            );
-        }
-
-        return $response;
-    }
-
-    /**
-     * Whether response is message.
-     *
-     * @param mixed $message
-     *
-     * @return bool
-     */
-    protected function isMessage($message)
-    {
-        if (is_array($message)) {
-            foreach ($message as $element) {
-                if (!is_subclass_of($element, AbstractMessage::class)) {
-                    return false;
-                }
-            }
-
-            return true;
-        }
-
-        return is_subclass_of($message, AbstractMessage::class);
-    }
-
-    /**
-     * Get request message.
-     *
-     * @return array
-     *
-     * @throws BadRequestException
-     */
-    public function getMessage()
-    {
-        $message = $this->parseMessageFromRequest($this->request->getContent(false));
-
-        if (!is_array($message) || empty($message)) {
-            throw new BadRequestException('Invalid request.');
-        }
-
-        return $message;
-    }
-
-    /**
-     * Handle request.
-     *
-     * @return array
-     *
-     * @throws \EasyWeChat\Core\Exceptions\RuntimeException
-     * @throws \EasyWeChat\Server\BadRequestException
-     */
-    protected function handleRequest()
-    {
-        $message = $this->getMessage();
-        $response = $this->handleMessage($message);
-
-        $messageType = isset($message['msg_type']) ? $message['msg_type'] : $message['MsgType'];
-
-        if ('device_text' === $messageType) {
-            $message['FromUserName'] = '';
-            $message['ToUserName'] = '';
-        }
-
-        return [
-            'to' => $message['FromUserName'],
-            'from' => $message['ToUserName'],
-            'response' => $response,
-        ];
-    }
-
-    /**
-     * Handle message.
-     *
-     * @param array $message
-     *
-     * @return mixed
-     */
-    protected function handleMessage(array $message)
-    {
-        $handler = $this->messageHandler;
-
-        if (!is_callable($handler)) {
-            Log::debug('No handler enabled.');
-
-            return null;
-        }
-
-        Log::debug('Message detail:', $message);
-
-        $message = new Collection($message);
-
-        $messageType = $message->get('msg_type', $message->get('MsgType'));
-
-        $type = $this->messageTypeMapping[$messageType];
-
-        $response = null;
-
-        if ($this->messageFilter & $type) {
-            $response = call_user_func_array($handler, [$message]);
-        }
-
-        return $response;
-    }
-
-    /**
-     * Build reply XML.
-     *
-     * @param string          $to
-     * @param string          $from
-     * @param AbstractMessage $message
-     *
-     * @return string
-     */
-    protected function buildReply($to, $from, $message)
-    {
-        $base = [
-            'ToUserName' => $to,
-            'FromUserName' => $from,
-            'CreateTime' => time(),
-            'MsgType' => is_array($message) ? current($message)->getType() : $message->getType(),
-        ];
-
-        $transformer = new Transformer();
-
-        return XML::build(array_merge($base, $transformer->transform($message)));
-    }
-
-    /**
-     * Get signature.
-     *
-     * @param array $request
-     *
-     * @return string
-     */
-    protected function signature($request)
-    {
-        sort($request, SORT_STRING);
-
-        return sha1(implode($request));
-    }
-
-    /**
-     * Parse message array from raw php input.
-     *
-     * @param string|resource $content
-     *
-     * @throws \EasyWeChat\Core\Exceptions\RuntimeException
-     * @throws \EasyWeChat\Encryption\EncryptionException
-     *
-     * @return array
-     */
-    protected function parseMessageFromRequest($content)
-    {
-        $content = strval($content);
-
-        $dataSet = json_decode($content, true);
-        if ($dataSet && (JSON_ERROR_NONE === json_last_error())) {
-            // For mini-program JSON formats.
-            // Convert to XML if the given string can be decode into a data array.
-            $content = XML::build($dataSet);
-        }
-
-        if ($this->isSafeMode()) {
-            if (!$this->encryptor) {
-                throw new RuntimeException('Safe mode Encryptor is necessary, please use Guard::setEncryptor(Encryptor $encryptor) set the encryptor instance.');
-            }
-
-            $message = $this->encryptor->decryptMsg(
-                $this->request->get('msg_signature'),
-                $this->request->get('nonce'),
-                $this->request->get('timestamp'),
-                $content
-            );
-        } else {
-            $message = XML::parse($content);
-        }
-
-        return $message;
-    }
-
-    /**
-     * Check the request message safe mode.
-     *
-     * @return bool
-     */
-    private function isSafeMode()
-    {
-        return $this->request->get('encrypt_type') && 'aes' === $this->request->get('encrypt_type');
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Server/LICENSE b/vendor/overtrue/wechat/src/Server/LICENSE
deleted file mode 100644
index c5251b8..0000000
--- a/vendor/overtrue/wechat/src/Server/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 overtrue <anzhengchao@gmail.com>
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Server/README.md b/vendor/overtrue/wechat/src/Server/README.md
deleted file mode 100644
index 615af0d..0000000
--- a/vendor/overtrue/wechat/src/Server/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# server
-微信 SDK 服务器端模块
diff --git a/vendor/overtrue/wechat/src/Server/Transformer.php b/vendor/overtrue/wechat/src/Server/Transformer.php
deleted file mode 100644
index 41768b2..0000000
--- a/vendor/overtrue/wechat/src/Server/Transformer.php
+++ /dev/null
@@ -1,195 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Transformer.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Server;
-
-use EasyWeChat\Message\AbstractMessage;
-use EasyWeChat\Message\News;
-use EasyWeChat\Message\Text;
-
-/**
- * Class Transformer.
- */
-class Transformer
-{
-    /**
-     * transform message to XML.
-     *
-     * @param array|string|AbstractMessage $message
-     *
-     * @return array
-     */
-    public function transform($message)
-    {
-        if (is_array($message)) {
-            $class = News::class;
-        } else {
-            if (is_string($message)) {
-                $message = new Text(['content' => $message]);
-            }
-
-            $class = get_class($message);
-        }
-
-        $handle = 'transform'.substr($class, strlen('EasyWeChat\Message\\'));
-
-        return method_exists($this, $handle) ? $this->$handle($message) : [];
-    }
-
-    /**
-     * Transform text message.
-     *
-     * @return array
-     */
-    public function transformText(AbstractMessage $message)
-    {
-        return [
-                'Content' => $message->get('content'),
-               ];
-    }
-
-    /**
-     * Transform image message.
-     *
-     * @return array
-     */
-    public function transformImage(AbstractMessage $message)
-    {
-        return [
-                'Image' => [
-                            'MediaId' => $message->get('media_id'),
-                           ],
-               ];
-    }
-
-    /**
-     * Transform video message.
-     *
-     * @return array
-     */
-    public function transformVideo(AbstractMessage $message)
-    {
-        $response = [
-                     'Video' => [
-                                 'MediaId' => $message->get('media_id'),
-                                 'Title' => $message->get('title'),
-                                 'Description' => $message->get('description'),
-                                ],
-                    ];
-
-        return $response;
-    }
-
-    /**
-     * Transform music message.
-     *
-     * @return array
-     */
-    public function transformMusic(AbstractMessage $message)
-    {
-        $response = [
-                        'Music' => [
-                            'Title' => $message->get('title'),
-                            'Description' => $message->get('description'),
-                            'MusicUrl' => $message->get('url'),
-                            'HQMusicUrl' => $message->get('hq_url'),
-                            'ThumbMediaId' => $message->get('thumb_media_id'),
-                        ],
-                    ];
-
-        return $response;
-    }
-
-    /**
-     * Transform voice message.
-     *
-     * @return array
-     */
-    public function transformVoice(AbstractMessage $message)
-    {
-        return [
-                'Voice' => [
-                            'MediaId' => $message->get('media_id'),
-                           ],
-               ];
-    }
-
-    /**
-     * Transform transfer message.
-     *
-     * @return array
-     */
-    public function transformTransfer(AbstractMessage $message)
-    {
-        $response = [];
-
-        // 指定客服
-        if ($message->get('account')) {
-            $response['TransInfo'] = [
-                                      'KfAccount' => $message->get('account'),
-                                     ];
-        }
-
-        return $response;
-    }
-
-    /**
-     * Transform news message.
-     *
-     * @param array|\EasyWeChat\Message\News $news
-     *
-     * @return array
-     */
-    public function transformNews($news)
-    {
-        $articles = [];
-
-        if (!is_array($news)) {
-            $news = [$news];
-        }
-
-        foreach ($news as $item) {
-            $articles[] = [
-                           'Title' => $item->get('title'),
-                           'Description' => $item->get('description'),
-                           'Url' => $item->get('url'),
-                           'PicUrl' => $item->get('pic_url'),
-                          ];
-        }
-
-        return [
-                'ArticleCount' => count($articles),
-                'Articles' => $articles,
-               ];
-    }
-
-    public function transformDeviceText(AbstractMessage $message)
-    {
-        $response = [
-                        'DeviceType' => $message->get('device_type'),
-                        'DeviceID' => $message->get('device_id'),
-                        'SessionID' => $message->get('session_id'),
-                        'Content' => base64_encode($message->get('content')),
-                    ];
-
-        return $response;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Server/composer.json b/vendor/overtrue/wechat/src/Server/composer.json
deleted file mode 100644
index 2c092dd..0000000
--- a/vendor/overtrue/wechat/src/Server/composer.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-    "name": "easywechat/server",
-    "description": "server module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "server", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Server\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master",
-        "symfony/http-foundation": "~2.7|~2.8|~3.0",
-        "easywechat/message": "dev-master",
-        "easywechat/encryption": "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/ShakeAround/Device.php b/vendor/overtrue/wechat/src/ShakeAround/Device.php
deleted file mode 100644
index b4290c4..0000000
--- a/vendor/overtrue/wechat/src/ShakeAround/Device.php
+++ /dev/null
@@ -1,198 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Device.php.
- *
- * @author    allen05ren <allen05ren@outlook.com>
- * @copyright 2016 overtrue <i@overtrue.me>
- *
- * @see       https://github.com/overtrue
- * @see       http://overtrue.me
- */
-
-namespace EasyWeChat\ShakeAround;
-
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Core\Exceptions\InvalidArgumentException;
-
-/**
- * Class Device.
- */
-class Device extends AbstractAPI
-{
-    const API_DEVICE_APPLYID = 'https://api.weixin.qq.com/shakearound/device/applyid';
-    const API_DEVICE_APPLYSTATUS = 'https://api.weixin.qq.com/shakearound/device/applystatus';
-    const API_DEVICE_UPDATE = 'https://api.weixin.qq.com/shakearound/device/update';
-    const API_DEVICE_BINDLOCATION = 'https://api.weixin.qq.com/shakearound/device/bindlocation';
-    const API_DEVICE_SEARCH = 'https://api.weixin.qq.com/shakearound/device/search';
-
-    /**
-     * Apply device ids.
-     *
-     * @param int    $quantity
-     * @param string $reason
-     * @param string $comment
-     * @param int    $poiId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function apply($quantity, $reason, $comment = '', $poiId = null)
-    {
-        $params = [
-            'quantity' => intval($quantity),
-            'apply_reason' => $reason,
-        ];
-
-        if (!empty($comment)) {
-            $params['comment'] = $comment;
-        }
-
-        if (!is_null($poiId)) {
-            $params['poi_id'] = intval($poiId);
-        }
-
-        return $this->parseJSON('json', [self::API_DEVICE_APPLYID, $params]);
-    }
-
-    /**
-     * Get audit status.
-     *
-     * @param int $applyId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getStatus($applyId)
-    {
-        $params = [
-            'apply_id' => intval($applyId),
-        ];
-
-        return $this->parseJSON('json', [self::API_DEVICE_APPLYSTATUS, $params]);
-    }
-
-    /**
-     * Update a device comment.
-     *
-     * @param array  $deviceIdentifier
-     * @param string $comment
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function update(array $deviceIdentifier, $comment)
-    {
-        $params = [
-            'device_identifier' => $deviceIdentifier,
-            'comment' => $comment,
-        ];
-
-        return $this->parseJSON('json', [self::API_DEVICE_UPDATE, $params]);
-    }
-
-    /**
-     * Bind location for device.
-     *
-     * @param array  $deviceIdentifier
-     * @param int    $poiId
-     * @param int    $type
-     * @param string $poiAppid
-     *
-     * @return \EasyWeChat\Support\Collection
-     *
-     * @throws InvalidArgumentException
-     */
-    public function bindLocation(array $deviceIdentifier, $poiId, $type = 1, $poiAppid = null)
-    {
-        $params = [
-            'device_identifier' => $deviceIdentifier,
-            'poi_id' => intval($poiId),
-        ];
-
-        if (2 === $type) {
-            if (is_null($poiAppid)) {
-                throw new InvalidArgumentException('If value of argument #3 is 2, argument #4 is required.');
-            }
-            $params['type'] = 2;
-            $params['poi_appid'] = $poiAppid;
-        }
-
-        return $this->parseJSON('json', [self::API_DEVICE_BINDLOCATION, $params]);
-    }
-
-    /**
-     * Fetch batch of devices by deviceIds.
-     *
-     * @param array $deviceIdentifiers
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function fetchByIds(array $deviceIdentifiers)
-    {
-        $params = [
-            'type' => 1,
-            'device_identifiers' => $deviceIdentifiers,
-        ];
-
-        return $this->fetch($params);
-    }
-
-    /**
-     * Pagination to fetch batch of devices.
-     *
-     * @param int $lastSeen
-     * @param int $count
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function pagination($lastSeen, $count)
-    {
-        $params = [
-            'type' => 2,
-            'last_seen' => intval($lastSeen),
-            'count' => intval($count),
-        ];
-
-        return $this->fetch($params);
-    }
-
-    /**
-     * Fetch batch of devices by applyId.
-     *
-     * @param int $applyId
-     * @param int $lastSeen
-     * @param int $count
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function fetchByApplyId($applyId, $lastSeen, $count)
-    {
-        $params = [
-            'type' => 3,
-            'apply_id' => intval($applyId),
-            'last_seen' => intval($lastSeen),
-            'count' => intval($count),
-        ];
-
-        return $this->fetch($params);
-    }
-
-    /**
-     * Fetch batch of devices.
-     *
-     * @param array $params
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    private function fetch($params)
-    {
-        return $this->parseJSON('json', [self::API_DEVICE_SEARCH, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/ShakeAround/Group.php b/vendor/overtrue/wechat/src/ShakeAround/Group.php
deleted file mode 100644
index 820c986..0000000
--- a/vendor/overtrue/wechat/src/ShakeAround/Group.php
+++ /dev/null
@@ -1,162 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Group.php.
- *
- * @author    allen05ren <allen05ren@outlook.com>
- * @copyright 2016 overtrue <i@overtrue.me>
- *
- * @see       https://github.com/overtrue
- * @see       http://overtrue.me
- */
-
-namespace EasyWeChat\ShakeAround;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class Group.
- */
-class Group extends AbstractAPI
-{
-    const API_ADD = 'https://api.weixin.qq.com/shakearound/device/group/add';
-    const API_UPDATE = 'https://api.weixin.qq.com/shakearound/device/group/update';
-    const API_DELETE = 'https://api.weixin.qq.com/shakearound/device/group/delete';
-    const API_GET_LIST = 'https://api.weixin.qq.com/shakearound/device/group/getlist';
-    const API_GET_DETAIL = 'https://api.weixin.qq.com/shakearound/device/group/getdetail';
-    const API_ADD_DEVICE = 'https://api.weixin.qq.com/shakearound/device/group/adddevice';
-    const API_DELETE_DEVICE = 'https://api.weixin.qq.com/shakearound/device/group/deletedevice';
-
-    /**
-     * Add device group.
-     *
-     * @param string $name
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function add($name)
-    {
-        $params = [
-            'group_name' => $name,
-        ];
-
-        return $this->parseJSON('json', [self::API_ADD, $params]);
-    }
-
-    /**
-     * Update a device group name.
-     *
-     * @param int    $groupId
-     * @param string $name
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function update($groupId, $name)
-    {
-        $params = [
-            'group_id' => intval($groupId),
-            'group_name' => $name,
-        ];
-
-        return $this->parseJSON('json', [self::API_UPDATE, $params]);
-    }
-
-    /**
-     * Delete device group.
-     *
-     * @param int $groupId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function delete($groupId)
-    {
-        $params = [
-            'group_id' => intval($groupId),
-        ];
-
-        return $this->parseJSON('json', [self::API_DELETE, $params]);
-    }
-
-    /**
-     * List all device groups.
-     *
-     * @param int $begin
-     * @param int $count
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function lists($begin, $count)
-    {
-        $params = [
-            'begin' => intval($begin),
-            'count' => intval($count),
-        ];
-
-        return $this->parseJSON('json', [self::API_GET_LIST, $params]);
-    }
-
-    /**
-     * Get details of a device group.
-     *
-     * @param int $groupId
-     * @param int $begin
-     * @param int $count
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getDetails($groupId, $begin, $count)
-    {
-        $params = [
-            'group_id' => intval($groupId),
-            'begin' => intval($begin),
-            'count' => intval($count),
-        ];
-
-        return $this->parseJSON('json', [self::API_GET_DETAIL, $params]);
-    }
-
-    /**
-     * Add  one or more devices to a device group.
-     *
-     * @param int   $groupId
-     * @param array $deviceIdentifiers
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function addDevice($groupId, array $deviceIdentifiers)
-    {
-        $params = [
-            'group_id' => intval($groupId),
-            'device_identifiers' => $deviceIdentifiers,
-        ];
-
-        return $this->parseJSON('json', [self::API_ADD_DEVICE, $params]);
-    }
-
-    /**
-     * Remove one or more devices from a device group.
-     *
-     * @param int   $groupId
-     * @param array $deviceIdentifiers
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function removeDevice($groupId, array $deviceIdentifiers)
-    {
-        $params = [
-            'group_id' => intval($groupId),
-            'device_identifiers' => $deviceIdentifiers,
-        ];
-
-        return $this->parseJSON('json', [self::API_DELETE_DEVICE, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/ShakeAround/LICENSE b/vendor/overtrue/wechat/src/ShakeAround/LICENSE
deleted file mode 100644
index c5251b8..0000000
--- a/vendor/overtrue/wechat/src/ShakeAround/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 overtrue <anzhengchao@gmail.com>
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/ShakeAround/Material.php b/vendor/overtrue/wechat/src/ShakeAround/Material.php
deleted file mode 100644
index 98bee50..0000000
--- a/vendor/overtrue/wechat/src/ShakeAround/Material.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Material.php.
- *
- * @author    allen05ren <allen05ren@outlook.com>
- * @copyright 2016 overtrue <i@overtrue.me>
- *
- * @see       https://github.com/overtrue
- * @see       http://overtrue.me
- */
-
-namespace EasyWeChat\ShakeAround;
-
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Core\Exceptions\InvalidArgumentException;
-
-/**
- * Class Material.
- */
-class Material extends AbstractAPI
-{
-    const API_MATERIAL_ADD = 'https://api.weixin.qq.com/shakearound/material/add';
-
-    /**
-     * Upload image material.
-     *
-     * @param string $path
-     * @param string $type
-     *
-     * @return string
-     *
-     * @throws InvalidArgumentException
-     */
-    public function uploadImage($path, $type = 'icon')
-    {
-        if (!file_exists($path) || !is_readable($path)) {
-            throw new InvalidArgumentException("File does not exist, or the file is unreadable: '$path'");
-        }
-
-        $type = strtolower($type);
-
-        return $this->parseJSON('upload', [self::API_MATERIAL_ADD, ['media' => $path], [], ['type' => $type]]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/ShakeAround/Page.php b/vendor/overtrue/wechat/src/ShakeAround/Page.php
deleted file mode 100644
index 2b3bbe3..0000000
--- a/vendor/overtrue/wechat/src/ShakeAround/Page.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Page.php.
- *
- * @author    allen05ren <allen05ren@outlook.com>
- * @copyright 2016 overtrue <i@overtrue.me>
- *
- * @see       https://github.com/overtrue
- * @see       http://overtrue.me
- */
-
-namespace EasyWeChat\ShakeAround;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class Page.
- */
-class Page extends AbstractAPI
-{
-    const API_ADD = 'https://api.weixin.qq.com/shakearound/page/add';
-    const API_UPDATE = 'https://api.weixin.qq.com/shakearound/page/update';
-    const API_SEARCH = 'https://api.weixin.qq.com/shakearound/page/search';
-    const API_DELETE = 'https://api.weixin.qq.com/shakearound/page/delete';
-    const API_RELATION_SEARCH = 'https://api.weixin.qq.com/shakearound/relation/search';
-
-    /**
-     * Add a page.
-     *
-     * @param string $title
-     * @param string $description
-     * @param string $pageUrl
-     * @param string $iconUrl
-     * @param string $comment
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function add($title, $description, $pageUrl, $iconUrl, $comment = '')
-    {
-        $params = [
-            'title' => $title,
-            'description' => $description,
-            'page_url' => $pageUrl,
-            'icon_url' => $iconUrl,
-        ];
-        if ('' !== $comment) {
-            $params['comment'] = $comment;
-        }
-
-        return $this->parseJSON('json', [self::API_ADD, $params]);
-    }
-
-    /**
-     * update a page info.
-     *
-     * @param int    $pageId
-     * @param string $title
-     * @param string $description
-     * @param string $pageUrl
-     * @param string $iconUrl
-     * @param string $comment
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function update($pageId, $title, $description, $pageUrl, $iconUrl, $comment = '')
-    {
-        $params = [
-            'page_id' => intval($pageId),
-            'title' => $title,
-            'description' => $description,
-            'page_url' => $pageUrl,
-            'icon_url' => $iconUrl,
-        ];
-        if ('' !== $comment) {
-            $params['comment'] = $comment;
-        }
-
-        return $this->parseJSON('json', [self::API_UPDATE, $params]);
-    }
-
-    /**
-     * Fetch batch of pages by pageIds.
-     *
-     * @param array $pageIds
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function fetchByIds(array $pageIds)
-    {
-        $params = [
-            'type' => 1,
-            'page_ids' => $pageIds,
-        ];
-
-        return $this->parseJSON('json', [self::API_SEARCH, $params]);
-    }
-
-    /**
-     * Pagination to fetch batch of pages.
-     *
-     * @param int $begin
-     * @param int $count
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function pagination($begin, $count)
-    {
-        $params = [
-            'type' => 2,
-            'begin' => intval($begin),
-            'count' => intval($count),
-        ];
-
-        return $this->parseJSON('json', [self::API_SEARCH, $params]);
-    }
-
-    /**
-     * delete a page.
-     *
-     * @param int $pageId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function delete($pageId)
-    {
-        $params = [
-            'page_id' => intval($pageId),
-        ];
-
-        return $this->parseJSON('json', [self::API_DELETE, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/ShakeAround/README.md b/vendor/overtrue/wechat/src/ShakeAround/README.md
deleted file mode 100644
index b45cce2..0000000
--- a/vendor/overtrue/wechat/src/ShakeAround/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# shakearound
-微信 SDK 摇一摇周边模块
\ No newline at end of file
diff --git a/vendor/overtrue/wechat/src/ShakeAround/Relation.php b/vendor/overtrue/wechat/src/ShakeAround/Relation.php
deleted file mode 100644
index 730b984..0000000
--- a/vendor/overtrue/wechat/src/ShakeAround/Relation.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Relation.php.
- *
- * @author    allen05ren <allen05ren@outlook.com>
- * @copyright 2016 overtrue <i@overtrue.me>
- *
- * @see       https://github.com/overtrue
- * @see       http://overtrue.me
- */
-
-namespace EasyWeChat\ShakeAround;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class Relation.
- */
-class Relation extends AbstractAPI
-{
-    const API_DEVICE_BINDPAGE = 'https://api.weixin.qq.com/shakearound/device/bindpage';
-    const API_RELATION_SEARCH = 'https://api.weixin.qq.com/shakearound/relation/search';
-
-    /**
-     * Bind pages for device.
-     *
-     * @param array $deviceIdentifier
-     * @param array $pageIds
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function bindPage(array $deviceIdentifier, array $pageIds)
-    {
-        $params = [
-            'device_identifier' => $deviceIdentifier,
-            'page_ids' => $pageIds,
-        ];
-
-        return $this->parseJSON('json', [self::API_DEVICE_BINDPAGE, $params]);
-    }
-
-    /**
-     * Get pageIds by deviceId.
-     *
-     * @param array $deviceIdentifier
-     * @param bool  $raw
-     *
-     * @return array|\EasyWeChat\Support\Collection
-     */
-    public function getPageByDeviceId(array $deviceIdentifier, $raw = false)
-    {
-        $params = [
-            'type' => 1,
-            'device_identifier' => $deviceIdentifier,
-        ];
-
-        $result = $this->parseJSON('json', [self::API_RELATION_SEARCH, $params]);
-
-        if (true === $raw) {
-            return $result;
-        }
-        $page_ids = [];
-        if (!empty($result->data['relations'])) {
-            foreach ($result->data['relations'] as $item) {
-                $page_ids[] = $item['page_id'];
-            }
-        }
-
-        return $page_ids;
-    }
-
-    /**
-     * Get devices by pageId.
-     *
-     * @param int $pageId
-     * @param int $begin
-     * @param int $count
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getDeviceByPageId($pageId, $begin, $count)
-    {
-        $params = [
-            'type' => 2,
-            'page_id' => intval($pageId),
-            'begin' => intval($begin),
-            'count' => intval($count),
-        ];
-
-        return $this->parseJSON('json', [self::API_RELATION_SEARCH, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/ShakeAround/ShakeAround.php b/vendor/overtrue/wechat/src/ShakeAround/ShakeAround.php
deleted file mode 100644
index f0d540f..0000000
--- a/vendor/overtrue/wechat/src/ShakeAround/ShakeAround.php
+++ /dev/null
@@ -1,220 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * ShakeAround.php.
- *
- * @author    allen05ren <allen05ren@outlook.com>
- * @copyright 2016 overtrue <i@overtrue.me>
- *
- * @see       https://github.com/overtrue
- * @see       http://overtrue.me
- */
-
-namespace EasyWeChat\ShakeAround;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class ShakeAround.
- */
-class ShakeAround extends AbstractAPI
-{
-    const API_ACCOUNT_REGISTER = 'https://api.weixin.qq.com/shakearound/account/register';
-    const API_ACCOUNT_AUDIT_STATUS = 'https://api.weixin.qq.com/shakearound/account/auditstatus';
-    const API_GET_SHAKE_INFO = 'https://api.weixin.qq.com/shakearound/user/getshakeinfo';
-
-    /**
-     * Device instance.
-     *
-     * @var \EasyWeChat\ShakeAround\Device
-     */
-    protected $device = null;
-
-    /**
-     * Group instance.
-     *
-     * @var \EasyWeChat\ShakeAround\Group
-     */
-    protected $group = null;
-
-    /**
-     * Page instance.
-     *
-     * @var \EasyWeChat\ShakeAround\Page
-     */
-    protected $page = null;
-
-    /**
-     * Material instance.
-     *
-     * @var \EasyWeChat\ShakeAround\Material
-     */
-    protected $material = null;
-
-    /**
-     * Relation instance.
-     *
-     * @var \EasyWeChat\ShakeAround\Relation
-     */
-    protected $relation = null;
-
-    /**
-     * Stats instance.
-     *
-     * @var \EasyWeChat\ShakeAround\Stats
-     */
-    protected $stats = null;
-
-    /**
-     * Register shake around.
-     *
-     * @param string $name
-     * @param string $tel
-     * @param string $email
-     * @param string $industryId
-     * @param array  $certUrls
-     * @param string $reason
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function register($name, $tel, $email, $industryId, array $certUrls, $reason = '')
-    {
-        $params = [
-            'name' => $name,
-            'phone_number' => strval($tel),
-            'email' => $email,
-            'industry_id' => $industryId,
-            'qualification_cert_urls' => $certUrls,
-        ];
-
-        if ('' !== $reason) {
-            $params['apply_reason'] = $reason;
-        }
-
-        return $this->parseJSON('json', [self::API_ACCOUNT_REGISTER, $params]);
-    }
-
-    /**
-     * Get audit status.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getStatus()
-    {
-        return $this->parseJSON('get', [self::API_ACCOUNT_AUDIT_STATUS]);
-    }
-
-    /**
-     * Get shake info.
-     *
-     * @param string $ticket
-     * @param int    $needPoi
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getShakeInfo($ticket, $needPoi = null)
-    {
-        $params = [
-            'ticket' => $ticket,
-        ];
-
-        if (null !== $needPoi) {
-            $params['need_poi'] = intval($needPoi);
-        }
-
-        return $this->parseJSON('json', [self::API_GET_SHAKE_INFO, $params]);
-    }
-
-    /**
-     * Return the device instance.
-     *
-     * @return \EasyWeChat\ShakeAround\Device
-     */
-    public function device()
-    {
-        if (is_null($this->device)) {
-            $this->device = new Device($this->accessToken);
-        }
-
-        return $this->device;
-    }
-
-    /**
-     * Return the group instance.
-     *
-     * @return \EasyWeChat\ShakeAround\Group
-     */
-    public function group()
-    {
-        if (is_null($this->group)) {
-            $this->group = new Group($this->accessToken);
-        }
-
-        return $this->group;
-    }
-
-    /**
-     * Return the page instance.
-     *
-     * @return \EasyWeChat\ShakeAround\Page
-     */
-    public function page()
-    {
-        if (is_null($this->page)) {
-            $this->page = new Page($this->accessToken);
-        }
-
-        return $this->page;
-    }
-
-    /**
-     * Return the material instance.
-     *
-     * @return \EasyWeChat\ShakeAround\Material
-     */
-    public function material()
-    {
-        if (is_null($this->material)) {
-            $this->material = new Material($this->accessToken);
-        }
-
-        return $this->material;
-    }
-
-    /**
-     * Return the relation instance.
-     *
-     * @return \EasyWeChat\ShakeAround\Relation
-     */
-    public function relation()
-    {
-        if (is_null($this->relation)) {
-            $this->relation = new Relation($this->accessToken);
-        }
-
-        return $this->relation;
-    }
-
-    /**
-     * Return the stats instance.
-     *
-     * @return \EasyWeChat\ShakeAround\Stats
-     */
-    public function stats()
-    {
-        if (is_null($this->stats)) {
-            $this->stats = new Stats($this->accessToken);
-        }
-
-        return $this->stats;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/ShakeAround/Stats.php b/vendor/overtrue/wechat/src/ShakeAround/Stats.php
deleted file mode 100644
index eb6f343..0000000
--- a/vendor/overtrue/wechat/src/ShakeAround/Stats.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Stats.php.
- *
- * @author    allen05ren <allen05ren@outlook.com>
- * @copyright 2016 overtrue <i@overtrue.me>
- *
- * @see       https://github.com/overtrue
- * @see       http://overtrue.me
- */
-
-namespace EasyWeChat\ShakeAround;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class Stats.
- */
-class Stats extends AbstractAPI
-{
-    const API_DEVICE = 'https://api.weixin.qq.com/shakearound/statistics/device';
-    const API_DEVICE_LIST = 'https://api.weixin.qq.com/shakearound/statistics/devicelist';
-    const API_PAGE = 'https://api.weixin.qq.com/shakearound/statistics/page';
-    const API_PAGE_LIST = 'https://api.weixin.qq.com/shakearound/statistics/pagelist';
-
-    /**
-     * Fetch statistics data by deviceId.
-     *
-     * @param array $deviceIdentifier
-     * @param int   $beginDate        (Unix timestamp)
-     * @param int   $endDate          (Unix timestamp)
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function deviceSummary(array $deviceIdentifier, $beginDate, $endDate)
-    {
-        $params = [
-            'device_identifier' => $deviceIdentifier,
-            'begin_date' => $beginDate,
-            'end_date' => $endDate,
-        ];
-
-        return $this->parseJSON('json', [self::API_DEVICE, $params]);
-    }
-
-    /**
-     * Fetch all devices statistics data by date.
-     *
-     * @param int $timestamp
-     * @param int $pageIndex
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function batchDeviceSummary($timestamp, $pageIndex)
-    {
-        $params = [
-            'date' => $timestamp,
-            'page_index' => $pageIndex,
-        ];
-
-        return $this->parseJSON('json', [self::API_DEVICE_LIST, $params]);
-    }
-
-    /**
-     * Fetch statistics data by pageId.
-     *
-     * @param int $pageId
-     * @param int $beginDate (Unix timestamp)
-     * @param int $endDate   (Unix timestamp)
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function pageSummary($pageId, $beginDate, $endDate)
-    {
-        $params = [
-            'page_id' => $pageId,
-            'begin_date' => $beginDate,
-            'end_date' => $endDate,
-        ];
-
-        return $this->parseJSON('json', [self::API_PAGE, $params]);
-    }
-
-    /**
-     * Fetch all pages statistics data by date.
-     *
-     * @param int $timestamp
-     * @param int $pageIndex
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function batchPageSummary($timestamp, $pageIndex)
-    {
-        $params = [
-            'date' => $timestamp,
-            'page_index' => $pageIndex,
-        ];
-
-        return $this->parseJSON('json', [self::API_PAGE_LIST, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/ShakeAround/composer.json b/vendor/overtrue/wechat/src/ShakeAround/composer.json
deleted file mode 100644
index 0e5e43a..0000000
--- a/vendor/overtrue/wechat/src/ShakeAround/composer.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-    "name": "easywechat/shake-around",
-    "description": "shakea round module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "shakearound", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "allen05ren",
-            "email": "allen05ren@outlook.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\ShakeAround\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master",
-        "easywechat/message": "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Staff/LICENSE b/vendor/overtrue/wechat/src/Staff/LICENSE
deleted file mode 100644
index c5251b8..0000000
--- a/vendor/overtrue/wechat/src/Staff/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 overtrue <anzhengchao@gmail.com>
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Staff/MessageBuilder.php b/vendor/overtrue/wechat/src/Staff/MessageBuilder.php
deleted file mode 100644
index a03e0f7..0000000
--- a/vendor/overtrue/wechat/src/Staff/MessageBuilder.php
+++ /dev/null
@@ -1,167 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * MessageBuilder.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Staff;
-
-use EasyWeChat\Core\Exceptions\InvalidArgumentException;
-use EasyWeChat\Core\Exceptions\RuntimeException;
-use EasyWeChat\Message\AbstractMessage;
-use EasyWeChat\Message\Raw as RawMessage;
-use EasyWeChat\Message\Text;
-
-/**
- * Class MessageBuilder.
- */
-class MessageBuilder
-{
-    /**
-     * Message to send.
-     *
-     * @var \EasyWeChat\Message\AbstractMessage;
-     */
-    protected $message;
-
-    /**
-     * Message target user open id.
-     *
-     * @var string
-     */
-    protected $to;
-
-    /**
-     * Message sender staff id.
-     *
-     * @var string
-     */
-    protected $account;
-
-    /**
-     * Staff instance.
-     *
-     * @var \EasyWeChat\Staff\Staff
-     */
-    protected $staff;
-
-    /**
-     * MessageBuilder constructor.
-     *
-     * @param \EasyWeChat\Staff\Staff $staff
-     */
-    public function __construct(Staff $staff)
-    {
-        $this->staff = $staff;
-    }
-
-    /**
-     * Set message to send.
-     *
-     * @param string|AbstractMessage $message
-     *
-     * @return MessageBuilder
-     *
-     * @throws InvalidArgumentException
-     */
-    public function message($message)
-    {
-        if (is_string($message)) {
-            $message = new Text(['content' => $message]);
-        }
-
-        $this->message = $message;
-
-        return $this;
-    }
-
-    /**
-     * Set staff account to send message.
-     *
-     * @param string $account
-     *
-     * @return MessageBuilder
-     */
-    public function by($account)
-    {
-        $this->account = $account;
-
-        return $this;
-    }
-
-    /**
-     * Set target user open id.
-     *
-     * @param string $openId
-     *
-     * @return MessageBuilder
-     */
-    public function to($openId)
-    {
-        $this->to = $openId;
-
-        return $this;
-    }
-
-    /**
-     * Send the message.
-     *
-     * @return bool
-     *
-     * @throws RuntimeException
-     */
-    public function send()
-    {
-        if (empty($this->message)) {
-            throw new RuntimeException('No message to send.');
-        }
-
-        $transformer = new Transformer();
-
-        if ($this->message instanceof RawMessage) {
-            $message = $this->message->get('content');
-        } else {
-            $content = $transformer->transform($this->message);
-            $message = [
-                'touser' => $this->to,
-            ];
-
-            if ($this->account) {
-                $message['customservice'] = ['kf_account' => $this->account];
-            }
-
-            $message = array_merge($message, $content);
-        }
-
-        return $this->staff->send($message);
-    }
-
-    /**
-     * Return property.
-     *
-     * @param $property
-     *
-     * @return mixed
-     */
-    public function __get($property)
-    {
-        if (property_exists($this, $property)) {
-            return $this->$property;
-        }
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Staff/README.md b/vendor/overtrue/wechat/src/Staff/README.md
deleted file mode 100644
index e023dd5..0000000
--- a/vendor/overtrue/wechat/src/Staff/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# staff
-微信 SDK 客服模块
diff --git a/vendor/overtrue/wechat/src/Staff/Session.php b/vendor/overtrue/wechat/src/Staff/Session.php
deleted file mode 100644
index d473e1a..0000000
--- a/vendor/overtrue/wechat/src/Staff/Session.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Session.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Staff;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class Session.
- */
-class Session extends AbstractAPI
-{
-    const API_CREATE = 'https://api.weixin.qq.com/customservice/kfsession/create';
-    const API_CLOSE = 'https://api.weixin.qq.com/customservice/kfsession/close';
-    const API_GET = 'https://api.weixin.qq.com/customservice/kfsession/getsession';
-    const API_LISTS = 'https://api.weixin.qq.com/customservice/kfsession/getsessionlist';
-    const API_WAITERS = 'https://api.weixin.qq.com/customservice/kfsession/getwaitcase';
-
-    /**
-     * List all sessions of $account.
-     *
-     * @param string $account
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function lists($account)
-    {
-        return $this->parseJSON('get', [self::API_LISTS, ['kf_account' => $account]]);
-    }
-
-    /**
-     * List all waiters of $account.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function waiters()
-    {
-        return $this->parseJSON('get', [self::API_WAITERS]);
-    }
-
-    /**
-     * Create a session.
-     *
-     * @param string $account
-     * @param string $openId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function create($account, $openId)
-    {
-        $params = [
-                   'kf_account' => $account,
-                   'openid' => $openId,
-                  ];
-
-        return $this->parseJSON('json', [self::API_CREATE, $params]);
-    }
-
-    /**
-     * Close a session.
-     *
-     * @param string $account
-     * @param string $openId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function close($account, $openId)
-    {
-        $params = [
-                   'kf_account' => $account,
-                   'openid' => $openId,
-                  ];
-
-        return $this->parseJSON('json', [self::API_CLOSE, $params]);
-    }
-
-    /**
-     * Get a session.
-     *
-     * @param string $openId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function get($openId)
-    {
-        return $this->parseJSON('get', [self::API_GET, ['openid' => $openId]]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Staff/Staff.php b/vendor/overtrue/wechat/src/Staff/Staff.php
deleted file mode 100644
index bf98013..0000000
--- a/vendor/overtrue/wechat/src/Staff/Staff.php
+++ /dev/null
@@ -1,225 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Staff.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Staff;
-
-use EasyWeChat\Core\AbstractAPI;
-use EasyWeChat\Support\Collection;
-
-/**
- * Class Staff.
- */
-class Staff extends AbstractAPI
-{
-    const API_LISTS = 'https://api.weixin.qq.com/cgi-bin/customservice/getkflist';
-    const API_ONLINE = 'https://api.weixin.qq.com/cgi-bin/customservice/getonlinekflist';
-    const API_DELETE = 'https://api.weixin.qq.com/customservice/kfaccount/del';
-    const API_UPDATE = 'https://api.weixin.qq.com/customservice/kfaccount/update';
-    const API_CREATE = 'https://api.weixin.qq.com/customservice/kfaccount/add';
-    const API_INVITE_BIND = 'https://api.weixin.qq.com/customservice/kfaccount/inviteworker';
-    const API_MESSAGE_SEND = 'https://api.weixin.qq.com/cgi-bin/message/custom/send';
-    const API_AVATAR_UPLOAD = 'https://api.weixin.qq.com/customservice/kfaccount/uploadheadimg';
-    const API_RECORDS = 'https://api.weixin.qq.com/customservice/msgrecord/getrecord';
-    const API_MSG_LIST = 'https://api.weixin.qq.com/customservice/msgrecord/getmsglist';
-
-    /**
-     * List all staffs.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function lists()
-    {
-        return $this->parseJSON('get', [self::API_LISTS]);
-    }
-
-    /**
-     * List all online staffs.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function onlines()
-    {
-        return $this->parseJSON('get', [self::API_ONLINE]);
-    }
-
-    /**
-     * Create a staff.
-     *
-     * @param string $account
-     * @param string $nickname
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function create($account, $nickname)
-    {
-        $params = [
-                   'kf_account' => $account,
-                   'nickname' => $nickname,
-                  ];
-
-        return $this->parseJSON('json', [self::API_CREATE, $params]);
-    }
-
-    /**
-     * Update a staff.
-     *
-     * @param string $account
-     * @param string $nickname
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function update($account, $nickname)
-    {
-        $params = [
-                   'kf_account' => $account,
-                   'nickname' => $nickname,
-                  ];
-
-        return $this->parseJSON('json', [self::API_UPDATE, $params]);
-    }
-
-    /**
-     * Delete a staff.
-     *
-     * @param string $account
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function delete($account)
-    {
-        // XXX: 微信那帮搞技术的都 TM 是 SB,url上的文本居然不 TM urlencode,
-        // 这里客服账号因为有 @ 符,而微信不接收urlencode的账号。。
-        // 简直是日了...
-        // #222
-        // PS: 如果你是微信做接口的,奉劝你们,尊重技术,不会别乱搞,笨不是你们的错,你们出来坑人就是大错特错。
-        $accessTokenField = sprintf('%s=%s', $this->accessToken->getQueryName(), $this->accessToken->getToken());
-        $url = sprintf(self::API_DELETE.'?%s&kf_account=%s', $accessTokenField, $account);
-
-        $contents = $this->getHttp()->parseJSON(file_get_contents($url));
-
-        $this->checkAndThrow($contents);
-
-        return new Collection($contents);
-    }
-
-    /**
-     * Invite a staff.
-     *
-     * @param string $account
-     * @param string $wechatId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function invite($account, $wechatId)
-    {
-        $params = [
-                   'kf_account' => $account,
-                   'invite_wx' => $wechatId,
-                  ];
-
-        return $this->parseJSON('json', [self::API_INVITE_BIND, $params]);
-    }
-
-    /**
-     * Set staff avatar.
-     *
-     * @param string $account
-     * @param string $path
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function avatar($account, $path)
-    {
-        return $this->parseJSON('upload', [self::API_AVATAR_UPLOAD, ['media' => $path], [], ['kf_account' => $account]]);
-    }
-
-    /**
-     * Get message builder.
-     *
-     * @param \EasyWeChat\Message\AbstractMessage|string $message
-     *
-     * @return \EasyWeChat\Staff\MessageBuilder
-     *
-     * @throws \EasyWeChat\Core\Exceptions\InvalidArgumentException
-     */
-    public function message($message)
-    {
-        $messageBuilder = new MessageBuilder($this);
-
-        return $messageBuilder->message($message);
-    }
-
-    /**
-     * Send a message.
-     *
-     * @param string|array $message
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function send($message)
-    {
-        return $this->parseJSON('json', [self::API_MESSAGE_SEND, $message]);
-    }
-
-    /**
-     * Get staff session history.
-     *
-     * @param int $startTime
-     * @param int $endTime
-     * @param int $page
-     * @param int $pageSize
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function records($startTime, $endTime, $page = 1, $pageSize = 10)
-    {
-        $params = [
-                   'starttime' => is_numeric($startTime) ? $startTime : strtotime($startTime),
-                   'endtime' => is_numeric($endTime) ? $endTime : strtotime($endTime),
-                   'pageindex' => $page,
-                   'pagesize' => $pageSize,
-                  ];
-
-        return $this->parseJSON('json', [self::API_RECORDS, $params]);
-    }
-
-    /**
-     * 获取聊天记录.
-     *
-     * @param int $startTime
-     * @param int $endTime
-     * @param int $msgId
-     * @param int $number
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function messages($startTime, $endTime, $msgId = 1, $number = 10000)
-    {
-        $params = [
-                   'starttime' => is_numeric($startTime) ? $startTime : strtotime($startTime),
-                   'endtime' => is_numeric($endTime) ? $endTime : strtotime($endTime),
-                   'msgid' => $msgId,
-                   'number' => $number,
-                  ];
-
-        return $this->parseJSON('json', [self::API_MSG_LIST, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Staff/Transformer.php b/vendor/overtrue/wechat/src/Staff/Transformer.php
deleted file mode 100644
index 89f551a..0000000
--- a/vendor/overtrue/wechat/src/Staff/Transformer.php
+++ /dev/null
@@ -1,217 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Transformer.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Staff;
-
-use EasyWeChat\Message\AbstractMessage;
-use EasyWeChat\Message\News;
-use EasyWeChat\Message\Text;
-
-/**
- * Class Transformer.
- */
-class Transformer
-{
-    /**
-     * transform message to XML.
-     *
-     * @param array|string|AbstractMessage $message
-     *
-     * @return array
-     */
-    public function transform($message)
-    {
-        if (is_array($message)) {
-            $class = News::class;
-        } else {
-            if (is_string($message)) {
-                $message = new Text(['content' => $message]);
-            }
-
-            $class = get_class($message);
-        }
-
-        $handle = 'transform'.substr($class, strlen('EasyWeChat\Message\\'));
-
-        return method_exists($this, $handle) ? $this->$handle($message) : [];
-    }
-
-    /**
-     * Transform text message.
-     *
-     * @return array
-     */
-    public function transformText(AbstractMessage $message)
-    {
-        return [
-                'msgtype' => 'text',
-                'text' => [
-                           'content' => $message->get('content'),
-                          ],
-               ];
-    }
-
-    /**
-     * Transform image message.
-     *
-     * @return array
-     */
-    public function transformImage(AbstractMessage $message)
-    {
-        return [
-                'msgtype' => 'image',
-                'image' => [
-                            'media_id' => $message->get('media_id'),
-                           ],
-               ];
-    }
-
-    /**
-     * Transform music message.
-     *
-     * @return array
-     */
-    public function transformMusic(AbstractMessage $message)
-    {
-        return [
-                'msgtype' => 'music',
-                'music' => [
-                            'title' => $message->get('title'),
-                            'description' => $message->get('description'),
-                            'musicurl' => $message->get('url'),
-                            'hqmusicurl' => $message->get('hq_url'),
-                            'thumb_media_id' => $message->get('thumb_media_id'),
-                           ],
-               ];
-    }
-
-    /**
-     * Transform video message.
-     *
-     * @return array
-     */
-    public function transformVideo(AbstractMessage $message)
-    {
-        return [
-                'msgtype' => 'video',
-                'video' => [
-                            'title' => $message->get('title'),
-                            'media_id' => $message->get('media_id'),
-                            'description' => $message->get('description'),
-                            'thumb_media_id' => $message->get('thumb_media_id'),
-                           ],
-               ];
-    }
-
-    /**
-     * Transform voice message.
-     *
-     * @return array
-     */
-    public function transformVoice(AbstractMessage $message)
-    {
-        return [
-                'msgtype' => 'voice',
-                'voice' => [
-                            'media_id' => $message->get('media_id'),
-                           ],
-               ];
-    }
-
-    /**
-     * Transform articles message.
-     *
-     * @return array
-     */
-    public function transformNews($news)
-    {
-        $articles = [];
-
-        if (!is_array($news)) {
-            $news = [$news];
-        }
-
-        foreach ($news as $item) {
-            $articles[] = [
-                           'title' => $item->get('title'),
-                           'description' => $item->get('description'),
-                           'url' => $item->get('url'),
-                           'picurl' => $item->get('pic_url'),
-                          ];
-        }
-
-        return ['msgtype' => 'news', 'news' => ['articles' => $articles]];
-    }
-
-    /**
-     * Transform material message.
-     *
-     * @return array
-     */
-    public function transformMaterial(AbstractMessage $message)
-    {
-        $type = $message->getType();
-
-        return [
-                'msgtype' => $type,
-                $type => [
-                            'media_id' => $message->get('media_id'),
-                           ],
-               ];
-    }
-
-    /**
-     * Transform wxcard message.
-     *
-     * @return array
-     */
-    public function transformCard(AbstractMessage $message)
-    {
-        $type = $message->getType();
-
-        return [
-                'msgtype' => $type,
-                $type => [
-                            'card_id' => $message->get('card_id'),
-                            ],
-               ];
-    }
-
-    /**
-     * Transform minprogrampage message.
-     *
-     * @return array
-     */
-    public function transformMiniProgramPage(AbstractMessage $message)
-    {
-        $type = $message->getType();
-
-        return [
-            'msgtype' => $type,
-            $type => [
-                'title' => $message->get('title'),
-                'appid' => $message->get('appid'),
-                'pagepath' => $message->get('pagepath'),
-                'thumb_media_id' => $message->get('thumb_media_id'),
-            ],
-        ];
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Staff/composer.json b/vendor/overtrue/wechat/src/Staff/composer.json
deleted file mode 100644
index 85ea296..0000000
--- a/vendor/overtrue/wechat/src/Staff/composer.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-    "name": "easywechat/staff",
-    "description": "staff module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "staff", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Staff\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master",
-        "easywechat/message": "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Stats/LICENSE b/vendor/overtrue/wechat/src/Stats/LICENSE
deleted file mode 100644
index 3a1dc92..0000000
--- a/vendor/overtrue/wechat/src/Stats/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Easy WeChat
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Stats/README.md b/vendor/overtrue/wechat/src/Stats/README.md
deleted file mode 100644
index 3aaebad..0000000
--- a/vendor/overtrue/wechat/src/Stats/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# stats
-微信 SDK 数据统计模块
diff --git a/vendor/overtrue/wechat/src/Stats/Stats.php b/vendor/overtrue/wechat/src/Stats/Stats.php
deleted file mode 100644
index cd7dd2c..0000000
--- a/vendor/overtrue/wechat/src/Stats/Stats.php
+++ /dev/null
@@ -1,371 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Stats.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Stats;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class stats.
- */
-class Stats extends AbstractAPI
-{
-    // 获取用户增减数据
-    const  API_USER_SUMMARY = 'https://api.weixin.qq.com/datacube/getusersummary';
-    // 获取累计用户数据
-    const  API_USER_CUMULATE = 'https://api.weixin.qq.com/datacube/getusercumulate';
-    // 获取图文群发每日数据
-    const  API_ARTICLE_SUMMARY = 'https://api.weixin.qq.com/datacube/getarticlesummary';
-    // 获取图文群发总数据
-    const  API_ARTICLE_TOTAL = 'https://api.weixin.qq.com/datacube/getarticletotal';
-    // 获取图文统计数据
-    const  API_USER_READ_SUMMARY = 'https://api.weixin.qq.com/datacube/getuserread';
-    // 获取图文统计分时数据
-    const  API_USER_READ_HOURLY = 'https://api.weixin.qq.com/datacube/getuserreadhour';
-    // 获取图文分享转发数据
-    const  API_USER_SHARE_SUMMARY = 'https://api.weixin.qq.com/datacube/getusershare';
-    // 获取图文分享转发分时数据
-    const  API_USER_SHARE_HOURLY = 'https://api.weixin.qq.com/datacube/getusersharehour';
-    // 获取消息发送概况数据
-    const  API_UPSTREAM_MSG_SUMMARY = 'https://api.weixin.qq.com/datacube/getupstreammsg';
-    // 获取消息分送分时数据
-    const  API_UPSTREAM_MSG_HOURLY = 'https://api.weixin.qq.com/datacube/getupstreammsghour';
-    // 获取消息发送周数据
-    const  API_UPSTREAM_MSG_WEEKLY = 'https://api.weixin.qq.com/datacube/getupstreammsgweek';
-    // 获取消息发送月数据
-    const  API_UPSTREAM_MSG_MONTHLY = 'https://api.weixin.qq.com/datacube/getupstreammsgmonth';
-    // 获取消息发送分布数据
-    const  API_UPSTREAM_MSG_DIST_SUMMARY = 'https://api.weixin.qq.com/datacube/getupstreammsgdist';
-    // 获取消息发送分布周数据
-    const  API_UPSTREAM_MSG_DIST_WEEKLY = 'https://api.weixin.qq.com/datacube/getupstreammsgdistweek';
-    // 获取消息发送分布月数据
-    const  API_UPSTREAM_MSG_DIST_MONTHLY = 'https://api.weixin.qq.com/datacube/getupstreammsgdistmonth?';
-    // 获取接口分析数据
-    const  API_INTERFACE_SUMMARY = 'https://api.weixin.qq.com/datacube/getinterfacesummary';
-    // 获取接口分析分时数据
-    const  API_INTERFACE_SUMMARY_HOURLY = 'https://api.weixin.qq.com/datacube/getinterfacesummaryhour';
-    // 拉取卡券概况数据接口
-    const  API_CARD_SUMMARY = 'https://api.weixin.qq.com/datacube/getcardbizuininfo';
-    // 获取免费券数据接口
-    const  API_FREE_CARD_SUMMARY = 'https://api.weixin.qq.com/datacube/getcardcardinfo';
-    // 拉取会员卡数据接口
-    const  API_MEMBER_CARD_SUMMARY = 'https://api.weixin.qq.com/datacube/getcardmembercardinfo';
-
-    /**
-     * 获取用户增减数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function userSummary($from, $to)
-    {
-        return $this->query(self::API_USER_SUMMARY, $from, $to);
-    }
-
-    /**
-     * 获取累计用户数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function userCumulate($from, $to)
-    {
-        return $this->query(self::API_USER_CUMULATE, $from, $to);
-    }
-
-    /**
-     * 获取图文群发每日数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function articleSummary($from, $to)
-    {
-        return $this->query(self::API_ARTICLE_SUMMARY, $from, $to);
-    }
-
-    /**
-     * 获取图文群发总数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function articleTotal($from, $to)
-    {
-        return $this->query(self::API_ARTICLE_TOTAL, $from, $to);
-    }
-
-    /**
-     * 获取图文统计数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function userReadSummary($from, $to)
-    {
-        return $this->query(self::API_USER_READ_SUMMARY, $from, $to);
-    }
-
-    /**
-     * 获取图文统计分时数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function userReadHourly($from, $to)
-    {
-        return $this->query(self::API_USER_READ_HOURLY, $from, $to);
-    }
-
-    /**
-     * 获取图文分享转发数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function userShareSummary($from, $to)
-    {
-        return $this->query(self::API_USER_SHARE_SUMMARY, $from, $to);
-    }
-
-    /**
-     * 获取图文分享转发分时数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function userShareHourly($from, $to)
-    {
-        return $this->query(self::API_USER_SHARE_HOURLY, $from, $to);
-    }
-
-    /**
-     * 获取消息发送概况数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function upstreamMessageSummary($from, $to)
-    {
-        return $this->query(self::API_UPSTREAM_MSG_SUMMARY, $from, $to);
-    }
-
-    /**
-     * 获取消息分送分时数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function upstreamMessageHourly($from, $to)
-    {
-        return $this->query(self::API_UPSTREAM_MSG_HOURLY, $from, $to);
-    }
-
-    /**
-     * 获取消息发送周数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function upstreamMessageWeekly($from, $to)
-    {
-        return $this->query(self::API_UPSTREAM_MSG_WEEKLY, $from, $to);
-    }
-
-    /**
-     * 获取消息发送月数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function upstreamMessageMonthly($from, $to)
-    {
-        return $this->query(self::API_UPSTREAM_MSG_MONTHLY, $from, $to);
-    }
-
-    /**
-     * 获取消息发送分布数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function upstreamMessageDistSummary($from, $to)
-    {
-        return $this->query(self::API_UPSTREAM_MSG_DIST_SUMMARY, $from, $to);
-    }
-
-    /**
-     * 获取消息发送分布周数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function upstreamMessageDistWeekly($from, $to)
-    {
-        return $this->query(self::API_UPSTREAM_MSG_DIST_WEEKLY, $from, $to);
-    }
-
-    /**
-     * 获取消息发送分布月数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function upstreamMessageDistMonthly($from, $to)
-    {
-        return $this->query(self::API_UPSTREAM_MSG_DIST_MONTHLY, $from, $to);
-    }
-
-    /**
-     * 获取接口分析数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function interfaceSummary($from, $to)
-    {
-        return $this->query(self::API_INTERFACE_SUMMARY, $from, $to);
-    }
-
-    /**
-     * 获取接口分析分时数据.
-     *
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function interfaceSummaryHourly($from, $to)
-    {
-        return $this->query(self::API_INTERFACE_SUMMARY_HOURLY, $from, $to);
-    }
-
-    /**
-     * 拉取卡券概况数据接口.
-     *
-     * @param string $from
-     * @param string $to
-     * @param int    $condSource
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function cardSummary($from, $to, $condSource = 0)
-    {
-        $ext = [
-            'cond_source' => intval($condSource),
-        ];
-
-        return $this->query(self::API_CARD_SUMMARY, $from, $to, $ext);
-    }
-
-    /**
-     * 获取免费券数据接口.
-     *
-     * @param string $from
-     * @param string $to
-     * @param int    $condSource
-     * @param string $cardId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function freeCardSummary($from, $to, $condSource = 0, $cardId = '')
-    {
-        $ext = [
-            'cond_source' => intval($condSource),
-            'card_id' => $cardId,
-        ];
-
-        return $this->query(self::API_FREE_CARD_SUMMARY, $from, $to, $ext);
-    }
-
-    /**
-     * 拉取会员卡数据接口.
-     *
-     * @param string $from
-     * @param string $to
-     * @param int    $condSource
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function memberCardSummary($from, $to, $condSource = 0)
-    {
-        $ext = [
-            'cond_source' => intval($condSource),
-        ];
-
-        return $this->query(self::API_MEMBER_CARD_SUMMARY, $from, $to, $ext);
-    }
-
-    /**
-     * 查询数据.
-     *
-     * @param string $api
-     * @param string $from
-     * @param string $to
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    protected function query($api, $from, $to, array $ext = [])
-    {
-        $params = [
-            'begin_date' => $from,
-            'end_date' => $to,
-        ];
-
-        if (!empty($ext)) {
-            $params = array_merge($params, $ext);
-        }
-
-        return $this->parseJSON('json', [$api, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Stats/composer.json b/vendor/overtrue/wechat/src/Stats/composer.json
deleted file mode 100644
index d474aca..0000000
--- a/vendor/overtrue/wechat/src/Stats/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/stats",
-    "description": "stats module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "stats", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Stats\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Store/LICENSE b/vendor/overtrue/wechat/src/Store/LICENSE
deleted file mode 100644
index 3a1dc92..0000000
--- a/vendor/overtrue/wechat/src/Store/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Easy WeChat
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Store/README.md b/vendor/overtrue/wechat/src/Store/README.md
deleted file mode 100644
index 9a738e0..0000000
--- a/vendor/overtrue/wechat/src/Store/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Store
-微信 SDK 小店
diff --git a/vendor/overtrue/wechat/src/Store/Store.php b/vendor/overtrue/wechat/src/Store/Store.php
deleted file mode 100644
index 602eff9..0000000
--- a/vendor/overtrue/wechat/src/Store/Store.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Store.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Store;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class stats.
- */
-class Store extends AbstractAPI
-{
-}
diff --git a/vendor/overtrue/wechat/src/Store/composer.json b/vendor/overtrue/wechat/src/Store/composer.json
deleted file mode 100644
index 70848de..0000000
--- a/vendor/overtrue/wechat/src/Store/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/store",
-    "description": "shop module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "shop", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Store\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Support/Arr.php b/vendor/overtrue/wechat/src/Support/Arr.php
deleted file mode 100644
index 0f74aee..0000000
--- a/vendor/overtrue/wechat/src/Support/Arr.php
+++ /dev/null
@@ -1,384 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Arr.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- * @see      https://github.com/laravel/framework/blob/4.2/src/Illuminate/Support/Arr.php
- */
-
-namespace EasyWeChat\Support;
-
-use Closure;
-
-/**
- * Array helper from Illuminate\Support\Arr.
- */
-class Arr
-{
-    /**
-     * Add an element to an array using "dot" notation if it doesn't exist.
-     *
-     * @param array  $array
-     * @param string $key
-     * @param mixed  $value
-     *
-     * @return array
-     */
-    public static function add($array, $key, $value)
-    {
-        if (is_null(static::get($array, $key))) {
-            static::set($array, $key, $value);
-        }
-
-        return $array;
-    }
-
-    /**
-     * Build a new array using a callback.
-     *
-     * @param array    $array
-     * @param \Closure $callback
-     *
-     * @return array
-     */
-    public static function build($array, Closure $callback)
-    {
-        $results = [];
-
-        foreach ($array as $key => $value) {
-            list($innerKey, $innerValue) = call_user_func($callback, $key, $value);
-            $results[$innerKey] = $innerValue;
-        }
-
-        return $results;
-    }
-
-    /**
-     * Divide an array into two arrays. One with keys and the other with values.
-     *
-     * @param array $array
-     *
-     * @return array
-     */
-    public static function divide($array)
-    {
-        return [
-                array_keys($array),
-                array_values($array),
-               ];
-    }
-
-    /**
-     * Flatten a multi-dimensional associative array with dots.
-     *
-     * @param array  $array
-     * @param string $prepend
-     *
-     * @return array
-     */
-    public static function dot($array, $prepend = '')
-    {
-        $results = [];
-
-        foreach ($array as $key => $value) {
-            if (is_array($value)) {
-                $results = array_merge($results, static::dot($value, $prepend.$key.'.'));
-            } else {
-                $results[$prepend.$key] = $value;
-            }
-        }
-
-        return $results;
-    }
-
-    /**
-     * Get all of the given array except for a specified array of items.
-     *
-     * @param array        $array
-     * @param array|string $keys
-     *
-     * @return array
-     */
-    public static function except($array, $keys)
-    {
-        return array_diff_key($array, array_flip((array) $keys));
-    }
-
-    /**
-     * Fetch a flattened array of a nested array element.
-     *
-     * @param array  $array
-     * @param string $key
-     *
-     * @return array
-     */
-    public static function fetch($array, $key)
-    {
-        $results = [];
-
-        foreach (explode('.', $key) as $segment) {
-            $results = [];
-            foreach ($array as $value) {
-                $value = (array) $value;
-                $results[] = $value[$segment];
-            }
-            $array = array_values($results);
-        }
-
-        return array_values($results);
-    }
-
-    /**
-     * Return the first element in an array passing a given truth test.
-     *
-     * @param array    $array
-     * @param \Closure $callback
-     * @param mixed    $default
-     *
-     * @return mixed
-     */
-    public static function first($array, $callback, $default = null)
-    {
-        foreach ($array as $key => $value) {
-            if (call_user_func($callback, $key, $value)) {
-                return $value;
-            }
-        }
-
-        return $default;
-    }
-
-    /**
-     * Return the last element in an array passing a given truth test.
-     *
-     * @param array    $array
-     * @param \Closure $callback
-     * @param mixed    $default
-     *
-     * @return mixed
-     */
-    public static function last($array, $callback, $default = null)
-    {
-        return static::first(array_reverse($array), $callback, $default);
-    }
-
-    /**
-     * Flatten a multi-dimensional array into a single level.
-     *
-     * @param array $array
-     *
-     * @return array
-     */
-    public static function flatten($array)
-    {
-        $return = [];
-        array_walk_recursive(
-            $array,
-            function ($x) use (&$return) {
-                $return[] = $x;
-            }
-        );
-
-        return $return;
-    }
-
-    /**
-     * Remove one or many array items from a given array using "dot" notation.
-     *
-     * @param array        $array
-     * @param array|string $keys
-     */
-    public static function forget(&$array, $keys)
-    {
-        $original = &$array;
-
-        foreach ((array) $keys as $key) {
-            $parts = explode('.', $key);
-            while (count($parts) > 1) {
-                $part = array_shift($parts);
-                if (isset($array[$part]) && is_array($array[$part])) {
-                    $array = &$array[$part];
-                }
-            }
-            unset($array[array_shift($parts)]);
-            // clean up after each pass
-            $array = &$original;
-        }
-    }
-
-    /**
-     * Get an item from an array using "dot" notation.
-     *
-     * @param array  $array
-     * @param string $key
-     * @param mixed  $default
-     *
-     * @return mixed
-     */
-    public static function get($array, $key, $default = null)
-    {
-        if (is_null($key)) {
-            return $array;
-        }
-
-        if (isset($array[$key])) {
-            return $array[$key];
-        }
-
-        foreach (explode('.', $key) as $segment) {
-            if (!is_array($array) || !array_key_exists($segment, $array)) {
-                return $default;
-            }
-            $array = $array[$segment];
-        }
-
-        return $array;
-    }
-
-    /**
-     * Get a subset of the items from the given array.
-     *
-     * @param array        $array
-     * @param array|string $keys
-     *
-     * @return array
-     */
-    public static function only($array, $keys)
-    {
-        return array_intersect_key($array, array_flip((array) $keys));
-    }
-
-    /**
-     * Pluck an array of values from an array.
-     *
-     * @param array  $array
-     * @param string $value
-     * @param string $key
-     *
-     * @return array
-     */
-    public static function pluck($array, $value, $key = null)
-    {
-        $results = [];
-
-        foreach ($array as $item) {
-            $itemValue = is_object($item) ? $item->{$value} : $item[$value];
-            // If the key is "null", we will just append the value to the array and keep
-            // looping. Otherwise we will key the array using the value of the key we
-            // received from the developer. Then we'll return the final array form.
-            if (is_null($key)) {
-                $results[] = $itemValue;
-            } else {
-                $itemKey = is_object($item) ? $item->{$key} : $item[$key];
-                $results[$itemKey] = $itemValue;
-            }
-        }
-
-        return $results;
-    }
-
-    /**
-     * Get a value from the array, and remove it.
-     *
-     * @param array  $array
-     * @param string $key
-     * @param mixed  $default
-     *
-     * @return mixed
-     */
-    public static function pull(&$array, $key, $default = null)
-    {
-        $value = static::get($array, $key, $default);
-        static::forget($array, $key);
-
-        return $value;
-    }
-
-    /**
-     * Set an array item to a given value using "dot" notation.
-     *
-     * If no key is given to the method, the entire array will be replaced.
-     *
-     * @param array  $array
-     * @param string $key
-     * @param mixed  $value
-     *
-     * @return array
-     */
-    public static function set(&$array, $key, $value)
-    {
-        if (is_null($key)) {
-            return $array = $value;
-        }
-
-        $keys = explode('.', $key);
-
-        while (count($keys) > 1) {
-            $key = array_shift($keys);
-            // If the key doesn't exist at this depth, we will just create an empty array
-            // to hold the next value, allowing us to create the arrays to hold final
-            // values at the correct depth. Then we'll keep digging into the array.
-            if (!isset($array[$key]) || !is_array($array[$key])) {
-                $array[$key] = [];
-            }
-            $array = &$array[$key];
-        }
-        $array[array_shift($keys)] = $value;
-
-        return $array;
-    }
-
-    /**
-     * Sort the array using the given Closure.
-     *
-     * @param array    $array
-     * @param \Closure $callback
-     *
-     * @return array
-     */
-    public static function sort($array, Closure $callback)
-    {
-        $results = [];
-
-        foreach ($array as $key => $value) {
-            $results[$key] = $callback($value);
-        }
-
-        return $results;
-    }
-
-    /**
-     * Filter the array using the given Closure.
-     *
-     * @param array    $array
-     * @param \Closure $callback
-     *
-     * @return array
-     */
-    public static function where($array, Closure $callback)
-    {
-        $filtered = [];
-
-        foreach ($array as $key => $value) {
-            if (call_user_func($callback, $key, $value)) {
-                $filtered[$key] = $value;
-            }
-        }
-
-        return $filtered;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Support/Attribute.php b/vendor/overtrue/wechat/src/Support/Attribute.php
deleted file mode 100644
index c128885..0000000
--- a/vendor/overtrue/wechat/src/Support/Attribute.php
+++ /dev/null
@@ -1,235 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Attributes.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Support;
-
-use EasyWeChat\Core\Exceptions\InvalidArgumentException;
-
-/**
- * Class Attributes.
- */
-abstract class Attribute extends Collection
-{
-    /**
-     * Attributes alias.
-     *
-     * @var array
-     */
-    protected $aliases = [];
-
-    /**
-     * Auto snake attribute name.
-     *
-     * @var bool
-     */
-    protected $snakeable = true;
-
-    /**
-     * Required attributes.
-     *
-     * @var array
-     */
-    protected $requirements = [];
-
-    /**
-     * Constructor.
-     *
-     * @param array $attributes
-     */
-    public function __construct(array $attributes = [])
-    {
-        parent::__construct($attributes);
-    }
-
-    /**
-     * Set attribute.
-     *
-     * @param string $attribute
-     * @param string $value
-     *
-     * @return Attribute
-     */
-    public function setAttribute($attribute, $value)
-    {
-        $this->set($attribute, $value);
-
-        return $this;
-    }
-
-    /**
-     * Get attribute.
-     *
-     * @param string $attribute
-     * @param mixed  $default
-     *
-     * @return mixed
-     */
-    public function getAttribute($attribute, $default)
-    {
-        return $this->get($attribute, $default);
-    }
-
-    /**
-     * Set attribute.
-     *
-     * @param string $attribute
-     * @param mixed  $value
-     *
-     * @return Attribute
-     *
-     * @throws \EasyWeChat\Core\Exceptions\InvalidArgumentException
-     */
-    public function with($attribute, $value)
-    {
-        $this->snakeable && $attribute = Str::snake($attribute);
-
-        if (!$this->validate($attribute, $value)) {
-            throw new InvalidArgumentException("Invalid attribute '{$attribute}'.");
-        }
-
-        $this->set($attribute, $value);
-
-        return $this;
-    }
-
-    /**
-     * Attribute validation.
-     *
-     * @param string $attribute
-     * @param mixed  $value
-     *
-     * @return bool
-     */
-    protected function validate($attribute, $value)
-    {
-        return true;
-    }
-
-    /**
-     * Override parent set() method.
-     *
-     * @param string $attribute
-     * @param mixed  $value
-     */
-    public function set($attribute, $value = null)
-    {
-        parent::set($this->getRealKey($attribute), $value);
-    }
-
-    /**
-     * Override parent get() method.
-     *
-     * @param string $attribute
-     * @param mixed  $default
-     *
-     * @return mixed
-     */
-    public function get($attribute, $default = null)
-    {
-        return parent::get($this->getRealKey($attribute), $default);
-    }
-
-    /**
-     * Magic call.
-     *
-     * @param string $method
-     * @param array  $args
-     *
-     * @return Attribute
-     */
-    public function __call($method, $args)
-    {
-        if (0 === stripos($method, 'with')) {
-            $method = substr($method, 4);
-        }
-
-        return $this->with($method, array_shift($args));
-    }
-
-    /**
-     * Magic set.
-     *
-     * @param string $property
-     * @param mixed  $value
-     *
-     * @return Attribute
-     */
-    public function __set($property, $value)
-    {
-        return $this->with($property, $value);
-    }
-
-    /**
-     * Whether or not an data exists by key.
-     *
-     * @param string $key
-     *
-     * @return bool
-     */
-    public function __isset($key)
-    {
-        return parent::__isset($this->getRealKey($key));
-    }
-
-    /**
-     * Return the raw name of attribute.
-     *
-     * @param string $key
-     *
-     * @return string
-     */
-    protected function getRealKey($key)
-    {
-        if ($alias = array_search($key, $this->aliases, true)) {
-            $key = $alias;
-        }
-
-        return $key;
-    }
-
-    /**
-     * Check required attributes.
-     *
-     * @throws InvalidArgumentException
-     */
-    protected function checkRequiredAttributes()
-    {
-        foreach ($this->requirements as $attribute) {
-            if (!isset($this->$attribute)) {
-                throw new InvalidArgumentException(" '{$attribute}' cannot be empty.");
-            }
-        }
-    }
-
-    /**
-     * Return all items.
-     *
-     * @return array
-     *
-     * @throws InvalidArgumentException
-     */
-    public function all()
-    {
-        $this->checkRequiredAttributes();
-
-        return parent::all();
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Support/Collection.php b/vendor/overtrue/wechat/src/Support/Collection.php
deleted file mode 100644
index 3d38623..0000000
--- a/vendor/overtrue/wechat/src/Support/Collection.php
+++ /dev/null
@@ -1,428 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Collection.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Support;
-
-use ArrayAccess;
-use ArrayIterator;
-use Countable;
-use IteratorAggregate;
-use JsonSerializable;
-use Serializable;
-
-/**
- * Class Collection.
- */
-class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable, Serializable
-{
-    /**
-     * The collection data.
-     *
-     * @var array
-     */
-    protected $items = [];
-
-    /**
-     * set data.
-     *
-     * @param mixed $items
-     */
-    public function __construct(array $items = [])
-    {
-        foreach ($items as $key => $value) {
-            $this->set($key, $value);
-        }
-    }
-
-    /**
-     * Return all items.
-     *
-     * @return array
-     */
-    public function all()
-    {
-        return $this->items;
-    }
-
-    /**
-     * Return specific items.
-     *
-     * @param array $keys
-     *
-     * @return array
-     */
-    public function only(array $keys)
-    {
-        $return = [];
-
-        foreach ($keys as $key) {
-            $value = $this->get($key);
-
-            if (!is_null($value)) {
-                $return[$key] = $value;
-            }
-        }
-
-        return $return;
-    }
-
-    /**
-     * Get all items except for those with the specified keys.
-     *
-     * @param mixed $keys
-     *
-     * @return static
-     */
-    public function except($keys)
-    {
-        $keys = is_array($keys) ? $keys : func_get_args();
-
-        return new static(Arr::except($this->items, $keys));
-    }
-
-    /**
-     * Merge data.
-     *
-     * @param Collection|array $items
-     *
-     * @return array
-     */
-    public function merge($items)
-    {
-        foreach ($items as $key => $value) {
-            $this->set($key, $value);
-        }
-
-        return $this->all();
-    }
-
-    /**
-     * To determine Whether the specified element exists.
-     *
-     * @param string $key
-     *
-     * @return bool
-     */
-    public function has($key)
-    {
-        return !is_null(Arr::get($this->items, $key));
-    }
-
-    /**
-     * Retrieve the first item.
-     *
-     * @return mixed
-     */
-    public function first()
-    {
-        return reset($this->items);
-    }
-
-    /**
-     * Retrieve the last item.
-     *
-     * @return bool
-     */
-    public function last()
-    {
-        $end = end($this->items);
-
-        reset($this->items);
-
-        return $end;
-    }
-
-    /**
-     * add the item value.
-     *
-     * @param string $key
-     * @param mixed  $value
-     */
-    public function add($key, $value)
-    {
-        Arr::set($this->items, $key, $value);
-    }
-
-    /**
-     * Set the item value.
-     *
-     * @param string $key
-     * @param mixed  $value
-     */
-    public function set($key, $value)
-    {
-        Arr::set($this->items, $key, $value);
-    }
-
-    /**
-     * Retrieve item from Collection.
-     *
-     * @param string $key
-     * @param mixed  $default
-     *
-     * @return mixed
-     */
-    public function get($key, $default = null)
-    {
-        return Arr::get($this->items, $key, $default);
-    }
-
-    /**
-     * Remove item form Collection.
-     *
-     * @param string $key
-     */
-    public function forget($key)
-    {
-        Arr::forget($this->items, $key);
-    }
-
-    /**
-     * Build to array.
-     *
-     * @return array
-     */
-    public function toArray()
-    {
-        return $this->all();
-    }
-
-    /**
-     * Build to json.
-     *
-     * @param int $option
-     *
-     * @return string
-     */
-    public function toJson($option = JSON_UNESCAPED_UNICODE)
-    {
-        return json_encode($this->all(), $option);
-    }
-
-    /**
-     * To string.
-     *
-     * @return string
-     */
-    public function __toString()
-    {
-        return $this->toJson();
-    }
-
-    /**
-     * (PHP 5 &gt;= 5.4.0)<br/>
-     * Specify data which should be serialized to JSON.
-     *
-     * @see http://php.net/manual/en/jsonserializable.jsonserialize.php
-     *
-     * @return mixed data which can be serialized by <b>json_encode</b>,
-     *               which is a value of any type other than a resource
-     */
-    public function jsonSerialize()
-    {
-        return $this->items;
-    }
-
-    /**
-     * (PHP 5 &gt;= 5.1.0)<br/>
-     * String representation of object.
-     *
-     * @see http://php.net/manual/en/serializable.serialize.php
-     *
-     * @return string the string representation of the object or null
-     */
-    public function serialize()
-    {
-        return serialize($this->items);
-    }
-
-    /**
-     * (PHP 5 &gt;= 5.0.0)<br/>
-     * Retrieve an external iterator.
-     *
-     * @see http://php.net/manual/en/iteratoraggregate.getiterator.php
-     *
-     * @return Traversable An instance of an object implementing <b>Iterator</b> or
-     *                     <b>Traversable</b>
-     */
-    public function getIterator()
-    {
-        return new ArrayIterator($this->items);
-    }
-
-    /**
-     * (PHP 5 &gt;= 5.1.0)<br/>
-     * Count elements of an object.
-     *
-     * @see http://php.net/manual/en/countable.count.php
-     *
-     * @return int The custom count as an integer.
-     *             </p>
-     *             <p>
-     *             The return value is cast to an integer
-     */
-    public function count()
-    {
-        return count($this->items);
-    }
-
-    /**
-     * (PHP 5 &gt;= 5.1.0)<br/>
-     * Constructs the object.
-     *
-     * @see  http://php.net/manual/en/serializable.unserialize.php
-     *
-     * @param string $serialized <p>
-     *                           The string representation of the object.
-     *                           </p>
-     *
-     * @return mixed|void
-     */
-    public function unserialize($serialized)
-    {
-        return $this->items = unserialize($serialized);
-    }
-
-    /**
-     * Get a data by key.
-     *
-     * @param string $key
-     *
-     * @return mixed
-     */
-    public function __get($key)
-    {
-        return $this->get($key);
-    }
-
-    /**
-     * Assigns a value to the specified data.
-     *
-     * @param string $key
-     * @param mixed  $value
-     */
-    public function __set($key, $value)
-    {
-        $this->set($key, $value);
-    }
-
-    /**
-     * Whether or not an data exists by key.
-     *
-     * @param string $key
-     *
-     * @return bool
-     */
-    public function __isset($key)
-    {
-        return $this->has($key);
-    }
-
-    /**
-     * Unsets an data by key.
-     *
-     * @param string $key
-     */
-    public function __unset($key)
-    {
-        $this->forget($key);
-    }
-
-    /**
-     * var_export.
-     *
-     * @return array
-     */
-    public function __set_state()
-    {
-        return $this->all();
-    }
-
-    /**
-     * (PHP 5 &gt;= 5.0.0)<br/>
-     * Whether a offset exists.
-     *
-     * @see http://php.net/manual/en/arrayaccess.offsetexists.php
-     *
-     * @param mixed $offset <p>
-     *                      An offset to check for.
-     *                      </p>
-     *
-     * @return bool true on success or false on failure.
-     *              The return value will be casted to boolean if non-boolean was returned
-     */
-    public function offsetExists($offset)
-    {
-        return $this->has($offset);
-    }
-
-    /**
-     * (PHP 5 &gt;= 5.0.0)<br/>
-     * Offset to unset.
-     *
-     * @see http://php.net/manual/en/arrayaccess.offsetunset.php
-     *
-     * @param mixed $offset <p>
-     *                      The offset to unset.
-     *                      </p>
-     */
-    public function offsetUnset($offset)
-    {
-        if ($this->offsetExists($offset)) {
-            $this->forget($offset);
-        }
-    }
-
-    /**
-     * (PHP 5 &gt;= 5.0.0)<br/>
-     * Offset to retrieve.
-     *
-     * @see http://php.net/manual/en/arrayaccess.offsetget.php
-     *
-     * @param mixed $offset <p>
-     *                      The offset to retrieve.
-     *                      </p>
-     *
-     * @return mixed Can return all value types
-     */
-    public function offsetGet($offset)
-    {
-        return $this->offsetExists($offset) ? $this->get($offset) : null;
-    }
-
-    /**
-     * (PHP 5 &gt;= 5.0.0)<br/>
-     * Offset to set.
-     *
-     * @see http://php.net/manual/en/arrayaccess.offsetset.php
-     *
-     * @param mixed $offset <p>
-     *                      The offset to assign the value to.
-     *                      </p>
-     * @param mixed $value  <p>
-     *                      The value to set.
-     *                      </p>
-     */
-    public function offsetSet($offset, $value)
-    {
-        $this->set($offset, $value);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Support/File.php b/vendor/overtrue/wechat/src/Support/File.php
deleted file mode 100644
index 7be227e..0000000
--- a/vendor/overtrue/wechat/src/Support/File.php
+++ /dev/null
@@ -1,140 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * File.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Support;
-
-use finfo;
-
-/**
- * Class File.
- */
-class File
-{
-    /**
-     * MIME mapping.
-     *
-     * @var array
-     */
-    protected static $extensionMap = [
-        'audio/wav' => '.wav',
-        'audio/x-ms-wma' => '.wma',
-        'video/x-ms-wmv' => '.wmv',
-        'video/mp4' => '.mp4',
-        'audio/mpeg' => '.mp3',
-        'audio/amr' => '.amr',
-        'application/vnd.rn-realmedia' => '.rm',
-        'audio/mid' => '.mid',
-        'image/bmp' => '.bmp',
-        'image/gif' => '.gif',
-        'image/png' => '.png',
-        'image/tiff' => '.tiff',
-        'image/jpeg' => '.jpg',
-
-                // 列举更多的文件 mime, 企业号是支持的, 公众平台这边之后万一也更新了呢
-        'application/msword' => '.doc',
-
-        'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => '.docx',
-        'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => '.dotx',
-        'application/vnd.ms-word.document.macroEnabled.12' => '.docm',
-        'application/vnd.ms-word.template.macroEnabled.12' => '.dotm',
-
-        'application/vnd.ms-excel' => '.xls',
-
-        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => '.xlsx',
-        'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => '.xltx',
-        'application/vnd.ms-excel.sheet.macroEnabled.12' => '.xlsm',
-        'application/vnd.ms-excel.template.macroEnabled.12' => '.xltm',
-        'application/vnd.ms-excel.addin.macroEnabled.12' => '.xlam',
-        'application/vnd.ms-excel.sheet.binary.macroEnabled.12' => '.xlsb',
-
-        'application/vnd.ms-powerpoint' => '.ppt',
-
-        'application/vnd.openxmlformats-officedocument.presentationml.presentation' => '.pptx',
-        'application/vnd.openxmlformats-officedocument.presentationml.template' => '.potx',
-        'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => '.ppsx',
-        'application/vnd.ms-powerpoint.addin.macroEnabled.12' => '.ppam',
-    ];
-
-    /**
-     * File header signatures.
-     *
-     * @var array
-     */
-    protected static $signatures = [
-        'ffd8ff' => '.jpg',
-        '424d' => '.bmp',
-        '47494638' => '.gif',
-        '89504e47' => '.png',
-        '494433' => '.mp3',
-        'fffb' => '.mp3',
-        'fff3' => '.mp3',
-        '3026b2758e66cf11' => '.wma',
-        '52494646' => '.wav',
-        '57415645' => '.wav',
-        '41564920' => '.avi',
-        '000001ba' => '.mpg',
-        '000001b3' => '.mpg',
-        '2321414d52' => '.amr',
-    ];
-
-    /**
-     * Return steam extension.
-     *
-     * @param string $stream
-     *
-     * @return string|false
-     */
-    public static function getStreamExt($stream)
-    {
-        try {
-            if (is_readable($stream)) {
-                $stream = file_get_contents($stream);
-            }
-        } catch (\Exception $e) {
-        }
-
-        $finfo = new finfo(FILEINFO_MIME);
-
-        $mime = strstr($finfo->buffer($stream), ';', true);
-
-        return isset(self::$extensionMap[$mime]) ? self::$extensionMap[$mime] : self::getExtBySignature($stream);
-    }
-
-    /**
-     * Get file extension by file header signature.
-     *
-     * @param string $stream
-     *
-     * @return string
-     */
-    public static function getExtBySignature($stream)
-    {
-        $prefix = strval(bin2hex(mb_strcut($stream, 0, 10)));
-
-        foreach (self::$signatures as $signature => $extension) {
-            if (0 === strpos($prefix, strval($signature))) {
-                return $extension;
-            }
-        }
-
-        return '';
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Support/LICENSE b/vendor/overtrue/wechat/src/Support/LICENSE
deleted file mode 100644
index c5251b8..0000000
--- a/vendor/overtrue/wechat/src/Support/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 overtrue <anzhengchao@gmail.com>
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Support/Log.php b/vendor/overtrue/wechat/src/Support/Log.php
deleted file mode 100644
index c3a390d..0000000
--- a/vendor/overtrue/wechat/src/Support/Log.php
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Log.php.
- *
- * This file is part of the wechat-components.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace EasyWeChat\Support;
-
-use Monolog\Handler\ErrorLogHandler;
-use Monolog\Handler\NullHandler;
-use Monolog\Logger;
-use Psr\Log\LoggerInterface;
-
-/**
- * Class Log.
- *
- * @method static debug($message, $context = null)
- * @method static info($message, $context = null)
- * @method static notice($message, $context = null)
- * @method static warning($message, $context = null)
- * @method static error($message, $context = null)
- * @method static critical($message, $context = null)
- * @method static alert($message, $context = null)
- * @method static emergency($message, $context = null)
- */
-class Log
-{
-    /**
-     * Logger instance.
-     *
-     * @var \Psr\Log\LoggerInterface
-     */
-    protected static $logger;
-
-    /**
-     * Return the logger instance.
-     *
-     * @return \Psr\Log\LoggerInterface
-     */
-    public static function getLogger()
-    {
-        return self::$logger ?: self::$logger = self::createDefaultLogger();
-    }
-
-    /**
-     * Set logger.
-     *
-     * @param \Psr\Log\LoggerInterface $logger
-     */
-    public static function setLogger(LoggerInterface $logger)
-    {
-        self::$logger = $logger;
-    }
-
-    /**
-     * Tests if logger exists.
-     *
-     * @return bool
-     */
-    public static function hasLogger()
-    {
-        return self::$logger ? true : false;
-    }
-
-    /**
-     * Forward call.
-     *
-     * @param string $method
-     * @param array  $args
-     *
-     * @return mixed
-     */
-    public static function __callStatic($method, $args)
-    {
-        return forward_static_call_array([self::getLogger(), $method], $args);
-    }
-
-    /**
-     * Forward call.
-     *
-     * @param string $method
-     * @param array  $args
-     *
-     * @return mixed
-     */
-    public function __call($method, $args)
-    {
-        return call_user_func_array([self::getLogger(), $method], $args);
-    }
-
-    /**
-     * Make a default log instance.
-     *
-     * @return \Monolog\Logger
-     */
-    private static function createDefaultLogger()
-    {
-        $log = new Logger('EasyWeChat');
-
-        if (defined('PHPUNIT_RUNNING') || 'cli' === php_sapi_name()) {
-            $log->pushHandler(new NullHandler());
-        } else {
-            $log->pushHandler(new ErrorLogHandler());
-        }
-
-        return $log;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Support/README.md b/vendor/overtrue/wechat/src/Support/README.md
deleted file mode 100644
index 081c6ff..0000000
--- a/vendor/overtrue/wechat/src/Support/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# support
-Tools for Wechat SDK.
diff --git a/vendor/overtrue/wechat/src/Support/Str.php b/vendor/overtrue/wechat/src/Support/Str.php
deleted file mode 100644
index e140b46..0000000
--- a/vendor/overtrue/wechat/src/Support/Str.php
+++ /dev/null
@@ -1,196 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Str.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Support;
-
-use EasyWeChat\Core\Exceptions\RuntimeException;
-
-class Str
-{
-    /**
-     * The cache of snake-cased words.
-     *
-     * @var array
-     */
-    protected static $snakeCache = [];
-
-    /**
-     * The cache of camel-cased words.
-     *
-     * @var array
-     */
-    protected static $camelCache = [];
-
-    /**
-     * The cache of studly-cased words.
-     *
-     * @var array
-     */
-    protected static $studlyCache = [];
-
-    /**
-     * Convert a value to camel case.
-     *
-     * @param string $value
-     *
-     * @return string
-     */
-    public static function camel($value)
-    {
-        if (isset(static::$camelCache[$value])) {
-            return static::$camelCache[$value];
-        }
-
-        return static::$camelCache[$value] = lcfirst(static::studly($value));
-    }
-
-    /**
-     * Generate a more truly "random" alpha-numeric string.
-     *
-     * @param int $length
-     *
-     * @return string
-     *
-     * @throws \RuntimeException
-     */
-    public static function random($length = 16)
-    {
-        $string = '';
-
-        while (($len = strlen($string)) < $length) {
-            $size = $length - $len;
-
-            $bytes = static::randomBytes($size);
-
-            $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size);
-        }
-
-        return $string;
-    }
-
-    /**
-     * Generate a more truly "random" bytes.
-     *
-     * @param int $length
-     *
-     * @return string
-     *
-     * @throws RuntimeException
-     */
-    public static function randomBytes($length = 16)
-    {
-        if (function_exists('random_bytes')) {
-            $bytes = random_bytes($length);
-        } elseif (function_exists('openssl_random_pseudo_bytes')) {
-            $bytes = openssl_random_pseudo_bytes($length, $strong);
-            if (false === $bytes || false === $strong) {
-                throw new RuntimeException('Unable to generate random string.');
-            }
-        } else {
-            throw new RuntimeException('OpenSSL extension is required for PHP 5 users.');
-        }
-
-        return $bytes;
-    }
-
-    /**
-     * Generate a "random" alpha-numeric string.
-     *
-     * Should not be considered sufficient for cryptography, etc.
-     *
-     * @param int $length
-     *
-     * @return string
-     */
-    public static function quickRandom($length = 16)
-    {
-        $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
-
-        return substr(str_shuffle(str_repeat($pool, $length)), 0, $length);
-    }
-
-    /**
-     * Convert the given string to upper-case.
-     *
-     * @param string $value
-     *
-     * @return string
-     */
-    public static function upper($value)
-    {
-        return mb_strtoupper($value);
-    }
-
-    /**
-     * Convert the given string to title case.
-     *
-     * @param string $value
-     *
-     * @return string
-     */
-    public static function title($value)
-    {
-        return mb_convert_case($value, MB_CASE_TITLE, 'UTF-8');
-    }
-
-    /**
-     * Convert a string to snake case.
-     *
-     * @param string $value
-     * @param string $delimiter
-     *
-     * @return string
-     */
-    public static function snake($value, $delimiter = '_')
-    {
-        $key = $value.$delimiter;
-
-        if (isset(static::$snakeCache[$key])) {
-            return static::$snakeCache[$key];
-        }
-
-        if (!ctype_lower($value)) {
-            $value = strtolower(preg_replace('/(.)(?=[A-Z])/', '$1'.$delimiter, $value));
-        }
-
-        return static::$snakeCache[$key] = $value;
-    }
-
-    /**
-     * Convert a value to studly caps case.
-     *
-     * @param string $value
-     *
-     * @return string
-     */
-    public static function studly($value)
-    {
-        $key = $value;
-
-        if (isset(static::$studlyCache[$key])) {
-            return static::$studlyCache[$key];
-        }
-
-        $value = ucwords(str_replace(['-', '_'], ' ', $value));
-
-        return static::$studlyCache[$key] = str_replace(' ', '', $value);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Support/Traits/PrefixedContainer.php b/vendor/overtrue/wechat/src/Support/Traits/PrefixedContainer.php
deleted file mode 100644
index 70ef547..0000000
--- a/vendor/overtrue/wechat/src/Support/Traits/PrefixedContainer.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Trait PrefixedContainer.php.
- *
- * Part of Overtrue\WeChat.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @author    mingyoung <mingyoungcheung@gmail.com>
- * @copyright 2017
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Support\Traits;
-
-use EasyWeChat\Support\Str;
-use Pimple\Container;
-
-/**
- * Trait PrefixedContainer.
- */
-trait PrefixedContainer
-{
-    /**
-     * Container.
-     *
-     * @var \Pimple\Container
-     */
-    protected $container;
-
-    /**
-     * ContainerAccess constructor.
-     *
-     * @param \Pimple\Container $container
-     */
-    public function __construct(Container $container)
-    {
-        $this->container = $container;
-    }
-
-    /**
-     * Fetches from pimple container.
-     *
-     * @param string        $key
-     * @param callable|null $callable
-     *
-     * @return mixed
-     */
-    public function fetch($key, callable $callable = null)
-    {
-        $instance = $this->$key;
-
-        if (!is_null($callable)) {
-            $callable($instance);
-        }
-
-        return $instance;
-    }
-
-    /**
-     * Gets a parameter or an object from pimple container.
-     *
-     * Get the `class basename` of the current class.
-     * Convert `class basename` to snake-case and concatenation with dot notation.
-     *
-     * E.g. Class 'EasyWechat', $key foo -> 'easy_wechat.foo'
-     *
-     * @param string $key The unique identifier for the parameter or object
-     *
-     * @return mixed The value of the parameter or an object
-     *
-     * @throws \InvalidArgumentException If the identifier is not defined
-     */
-    public function __get($key)
-    {
-        $className = basename(str_replace('\\', '/', static::class));
-
-        $name = Str::snake($className).'.'.$key;
-
-        return $this->container->offsetGet($name);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Support/Url.php b/vendor/overtrue/wechat/src/Support/Url.php
deleted file mode 100644
index 794b88d..0000000
--- a/vendor/overtrue/wechat/src/Support/Url.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Url.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Support;
-
-/**
- * Class Url.
- */
-class Url
-{
-    /**
-     * Get current url.
-     *
-     * @return string
-     */
-    public static function current()
-    {
-        if (defined('PHPUNIT_RUNNING')) {
-            return 'http://localhost';
-        }
-
-        $protocol = 'http://';
-
-        if ((!empty($_SERVER['HTTPS']) && 'off' !== $_SERVER['HTTPS'])
-            || (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO'])) {
-            $protocol = 'https://';
-        }
-
-        return $protocol.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Support/XML.php b/vendor/overtrue/wechat/src/Support/XML.php
deleted file mode 100644
index c3c12a7..0000000
--- a/vendor/overtrue/wechat/src/Support/XML.php
+++ /dev/null
@@ -1,162 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * XML.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Support;
-
-use SimpleXMLElement;
-
-/**
- * Class XML.
- */
-class XML
-{
-    /**
-     * XML to array.
-     *
-     * @param string $xml XML string
-     *
-     * @return array|\SimpleXMLElement
-     */
-    public static function parse($xml)
-    {
-        $backup = libxml_disable_entity_loader(true);
-
-        $result = self::normalize(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_COMPACT | LIBXML_NOCDATA | LIBXML_NOBLANKS));
-
-        libxml_disable_entity_loader($backup);
-
-        return $result;
-    }
-
-    /**
-     * XML encode.
-     *
-     * @param mixed  $data
-     * @param string $root
-     * @param string $item
-     * @param string $attr
-     * @param string $id
-     *
-     * @return string
-     */
-    public static function build(
-        $data,
-        $root = 'xml',
-        $item = 'item',
-        $attr = '',
-        $id = 'id'
-    ) {
-        if (is_array($attr)) {
-            $_attr = [];
-
-            foreach ($attr as $key => $value) {
-                $_attr[] = "{$key}=\"{$value}\"";
-            }
-
-            $attr = implode(' ', $_attr);
-        }
-
-        $attr = trim($attr);
-        $attr = empty($attr) ? '' : " {$attr}";
-        $xml = "<{$root}{$attr}>";
-        $xml .= self::data2Xml($data, $item, $id);
-        $xml .= "</{$root}>";
-
-        return $xml;
-    }
-
-    /**
-     * Build CDATA.
-     *
-     * @param string $string
-     *
-     * @return string
-     */
-    public static function cdata($string)
-    {
-        return sprintf('<![CDATA[%s]]>', $string);
-    }
-
-    /**
-     * Object to array.
-     *
-     *
-     * @param SimpleXMLElement $obj
-     *
-     * @return array
-     */
-    protected static function normalize($obj)
-    {
-        $result = null;
-
-        if (is_object($obj)) {
-            $obj = (array) $obj;
-        }
-
-        if (is_array($obj)) {
-            foreach ($obj as $key => $value) {
-                $res = self::normalize($value);
-                if (('@attributes' === $key) && ($key)) {
-                    $result = $res;
-                } else {
-                    $result[$key] = $res;
-                }
-            }
-        } else {
-            $result = $obj;
-        }
-
-        return $result;
-    }
-
-    /**
-     * Array to XML.
-     *
-     * @param array  $data
-     * @param string $item
-     * @param string $id
-     *
-     * @return string
-     */
-    protected static function data2Xml($data, $item = 'item', $id = 'id')
-    {
-        $xml = $attr = '';
-
-        foreach ($data as $key => $val) {
-            if (is_numeric($key)) {
-                $id && $attr = " {$id}=\"{$key}\"";
-                $key = $item;
-            }
-
-            $xml .= "<{$key}{$attr}>";
-
-            if ((is_array($val) || is_object($val))) {
-                $xml .= self::data2Xml((array) $val, $item, $id);
-            } else {
-                $xml .= is_numeric($val) ? $val : self::cdata($val);
-            }
-
-            $xml .= "</{$key}>";
-        }
-
-        return $xml;
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Support/composer.json b/vendor/overtrue/wechat/src/Support/composer.json
deleted file mode 100644
index a33ca27..0000000
--- a/vendor/overtrue/wechat/src/Support/composer.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-    "name": "easywechat/support",
-    "description": "support module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "support", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Support\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "monolog/monolog": "1.*",
-        "ext-SimpleXML": "*"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Url/LICENSE b/vendor/overtrue/wechat/src/Url/LICENSE
deleted file mode 100644
index 3a1dc92..0000000
--- a/vendor/overtrue/wechat/src/Url/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Easy WeChat
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/Url/README.md b/vendor/overtrue/wechat/src/Url/README.md
deleted file mode 100644
index e56367f..0000000
--- a/vendor/overtrue/wechat/src/Url/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# qrcode
-微信SDK 二维码模块
diff --git a/vendor/overtrue/wechat/src/Url/Url.php b/vendor/overtrue/wechat/src/Url/Url.php
deleted file mode 100644
index e78ec2c..0000000
--- a/vendor/overtrue/wechat/src/Url/Url.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Url.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\Url;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class Url.
- */
-class Url extends AbstractAPI
-{
-    const API_SHORTEN_URL = 'https://api.weixin.qq.com/cgi-bin/shorturl';
-
-    /**
-     * Shorten the url.
-     *
-     * @param string $url
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function shorten($url)
-    {
-        $params = [
-                   'action' => 'long2short',
-                   'long_url' => $url,
-                  ];
-
-        return $this->parseJSON('json', [self::API_SHORTEN_URL, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/Url/composer.json b/vendor/overtrue/wechat/src/Url/composer.json
deleted file mode 100644
index fa2d69a..0000000
--- a/vendor/overtrue/wechat/src/Url/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/url",
-    "description": "url module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "url", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\Url\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/overtrue/wechat/src/User/Group.php b/vendor/overtrue/wechat/src/User/Group.php
deleted file mode 100644
index 7d9fbb9..0000000
--- a/vendor/overtrue/wechat/src/User/Group.php
+++ /dev/null
@@ -1,150 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Group.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\User;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class Group.
- */
-class Group extends AbstractAPI
-{
-    const API_GET = 'https://api.weixin.qq.com/cgi-bin/groups/get';
-    const API_CREATE = 'https://api.weixin.qq.com/cgi-bin/groups/create';
-    const API_UPDATE = 'https://api.weixin.qq.com/cgi-bin/groups/update';
-    const API_DELETE = 'https://api.weixin.qq.com/cgi-bin/groups/delete';
-    const API_USER_GROUP_ID = 'https://api.weixin.qq.com/cgi-bin/groups/getid';
-    const API_MEMBER_UPDATE = 'https://api.weixin.qq.com/cgi-bin/groups/members/update';
-    const API_MEMBER_BATCH_UPDATE = 'https://api.weixin.qq.com/cgi-bin/groups/members/batchupdate';
-
-    /**
-     * Create group.
-     *
-     * @param string $name
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function create($name)
-    {
-        $params = [
-                   'group' => ['name' => $name],
-                  ];
-
-        return $this->parseJSON('json', [self::API_CREATE, $params]);
-    }
-
-    /**
-     * List all groups.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function lists()
-    {
-        return $this->parseJSON('get', [self::API_GET]);
-    }
-
-    /**
-     * Update a group name.
-     *
-     * @param int    $groupId
-     * @param string $name
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function update($groupId, $name)
-    {
-        $params = [
-                   'group' => [
-                               'id' => $groupId,
-                               'name' => $name,
-                              ],
-                  ];
-
-        return $this->parseJSON('json', [self::API_UPDATE, $params]);
-    }
-
-    /**
-     * Delete group.
-     *
-     * @param int $groupId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function delete($groupId)
-    {
-        $params = [
-                   'group' => ['id' => $groupId],
-                  ];
-
-        return $this->parseJSON('json', [self::API_DELETE, $params]);
-    }
-
-    /**
-     * Get user group.
-     *
-     * @param string $openId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function userGroup($openId)
-    {
-        $params = ['openid' => $openId];
-
-        return $this->parseJSON('json', [self::API_USER_GROUP_ID, $params]);
-    }
-
-    /**
-     * Move user to a group.
-     *
-     * @param string $openId
-     * @param int    $groupId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function moveUser($openId, $groupId)
-    {
-        $params = [
-                   'openid' => $openId,
-                   'to_groupid' => $groupId,
-                  ];
-
-        return $this->parseJSON('json', [self::API_MEMBER_UPDATE, $params]);
-    }
-
-    /**
-     * Batch move users to a group.
-     *
-     * @param array $openIds
-     * @param int   $groupId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function moveUsers(array $openIds, $groupId)
-    {
-        $params = [
-                   'openid_list' => $openIds,
-                   'to_groupid' => $groupId,
-                  ];
-
-        return $this->parseJSON('json', [self::API_MEMBER_BATCH_UPDATE, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/User/LICENSE b/vendor/overtrue/wechat/src/User/LICENSE
deleted file mode 100644
index c5251b8..0000000
--- a/vendor/overtrue/wechat/src/User/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 overtrue <anzhengchao@gmail.com>
-
-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.
-
diff --git a/vendor/overtrue/wechat/src/User/README.md b/vendor/overtrue/wechat/src/User/README.md
deleted file mode 100644
index 3e34ef6..0000000
--- a/vendor/overtrue/wechat/src/User/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# user
-微信 SDK 用户与用户组模块
diff --git a/vendor/overtrue/wechat/src/User/Tag.php b/vendor/overtrue/wechat/src/User/Tag.php
deleted file mode 100644
index a1a72d5..0000000
--- a/vendor/overtrue/wechat/src/User/Tag.php
+++ /dev/null
@@ -1,166 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * Group.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\User;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class Tag.
- */
-class Tag extends AbstractAPI
-{
-    const API_GET = 'https://api.weixin.qq.com/cgi-bin/tags/get';
-    const API_CREATE = 'https://api.weixin.qq.com/cgi-bin/tags/create';
-    const API_UPDATE = 'https://api.weixin.qq.com/cgi-bin/tags/update';
-    const API_DELETE = 'https://api.weixin.qq.com/cgi-bin/tags/delete';
-    const API_USER_TAGS = 'https://api.weixin.qq.com/cgi-bin/tags/getidlist';
-    const API_MEMBER_BATCH_TAG = 'https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging';
-    const API_MEMBER_BATCH_UNTAG = 'https://api.weixin.qq.com/cgi-bin/tags/members/batchuntagging';
-    const API_USERS_OF_TAG = 'https://api.weixin.qq.com/cgi-bin/user/tag/get';
-
-    /**
-     * Create tag.
-     *
-     * @param string $name
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function create($name)
-    {
-        $params = [
-                   'tag' => ['name' => $name],
-                  ];
-
-        return $this->parseJSON('json', [self::API_CREATE, $params]);
-    }
-
-    /**
-     * List all tags.
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function lists()
-    {
-        return $this->parseJSON('get', [self::API_GET]);
-    }
-
-    /**
-     * Update a tag name.
-     *
-     * @param int    $tagId
-     * @param string $name
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function update($tagId, $name)
-    {
-        $params = [
-                   'tag' => [
-                               'id' => $tagId,
-                               'name' => $name,
-                              ],
-                  ];
-
-        return $this->parseJSON('json', [self::API_UPDATE, $params]);
-    }
-
-    /**
-     * Delete tag.
-     *
-     * @param int $tagId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function delete($tagId)
-    {
-        $params = [
-                   'tag' => ['id' => $tagId],
-                  ];
-
-        return $this->parseJSON('json', [self::API_DELETE, $params]);
-    }
-
-    /**
-     * Get user tags.
-     *
-     * @param string $openId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function userTags($openId)
-    {
-        $params = ['openid' => $openId];
-
-        return $this->parseJSON('json', [self::API_USER_TAGS, $params]);
-    }
-
-    /**
-     * Get users from a tag.
-     *
-     * @param string $tagId
-     * @param string $nextOpenId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function usersOfTag($tagId, $nextOpenId = '')
-    {
-        $params = ['tagid' => $tagId, 'next_openid' => $nextOpenId];
-
-        return $this->parseJSON('json', [self::API_USERS_OF_TAG, $params]);
-    }
-
-    /**
-     * Batch tag users.
-     *
-     * @param array $openIds
-     * @param int   $tagId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function batchTagUsers(array $openIds, $tagId)
-    {
-        $params = [
-                   'openid_list' => $openIds,
-                   'tagid' => $tagId,
-                  ];
-
-        return $this->parseJSON('json', [self::API_MEMBER_BATCH_TAG, $params]);
-    }
-
-    /**
-     * Untag users from a tag.
-     *
-     * @param array $openIds
-     * @param int   $tagId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function batchUntagUsers(array $openIds, $tagId)
-    {
-        $params = [
-                   'openid_list' => $openIds,
-                   'tagid' => $tagId,
-                  ];
-
-        return $this->parseJSON('json', [self::API_MEMBER_BATCH_UNTAG, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/User/User.php b/vendor/overtrue/wechat/src/User/User.php
deleted file mode 100644
index a729eb8..0000000
--- a/vendor/overtrue/wechat/src/User/User.php
+++ /dev/null
@@ -1,180 +0,0 @@
-<?php
-
-/*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-/**
- * User.php.
- *
- * @author    overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see      https://github.com/overtrue
- * @see      http://overtrue.me
- */
-
-namespace EasyWeChat\User;
-
-use EasyWeChat\Core\AbstractAPI;
-
-/**
- * Class User.
- */
-class User extends AbstractAPI
-{
-    const API_GET = 'https://api.weixin.qq.com/cgi-bin/user/info';
-    const API_BATCH_GET = 'https://api.weixin.qq.com/cgi-bin/user/info/batchget';
-    const API_LIST = 'https://api.weixin.qq.com/cgi-bin/user/get';
-    const API_GROUP = 'https://api.weixin.qq.com/cgi-bin/groups/getid';
-    const API_REMARK = 'https://api.weixin.qq.com/cgi-bin/user/info/updateremark';
-    const API_OAUTH_GET = 'https://api.weixin.qq.com/sns/userinfo';
-    const API_GET_BLACK_LIST = 'https://api.weixin.qq.com/cgi-bin/tags/members/getblacklist';
-    const API_BATCH_BLACK_LIST = 'https://api.weixin.qq.com/cgi-bin/tags/members/batchblacklist';
-    const API_BATCH_UNBLACK_LIST = 'https://api.weixin.qq.com/cgi-bin/tags/members/batchunblacklist';
-
-    /**
-     * Fetch a user by open id.
-     *
-     * @param string $openId
-     * @param string $lang
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function get($openId, $lang = 'zh_CN')
-    {
-        $params = [
-                   'openid' => $openId,
-                   'lang' => $lang,
-                  ];
-
-        return $this->parseJSON('get', [self::API_GET, $params]);
-    }
-
-    /**
-     * Batch get users.
-     *
-     * @param array  $openIds
-     * @param string $lang
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function batchGet(array $openIds, $lang = 'zh_CN')
-    {
-        $params = [];
-
-        $params['user_list'] = array_map(function ($openId) use ($lang) {
-            return [
-                    'openid' => $openId,
-                    'lang' => $lang,
-                    ];
-        }, $openIds);
-
-        return $this->parseJSON('json', [self::API_BATCH_GET, $params]);
-    }
-
-    /**
-     * List users.
-     *
-     * @param string $nextOpenId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function lists($nextOpenId = null)
-    {
-        $params = ['next_openid' => $nextOpenId];
-
-        return $this->parseJSON('get', [self::API_LIST, $params]);
-    }
-
-    /**
-     * Set user remark.
-     *
-     * @param string $openId
-     * @param string $remark
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function remark($openId, $remark)
-    {
-        $params = [
-                   'openid' => $openId,
-                   'remark' => $remark,
-                  ];
-
-        return $this->parseJSON('json', [self::API_REMARK, $params]);
-    }
-
-    /**
-     * Get user's group id.
-     *
-     * @param string $openId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function group($openId)
-    {
-        return $this->getGroup($openId);
-    }
-
-    /**
-     * Get user's group.
-     *
-     * @param string $openId
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function getGroup($openId)
-    {
-        $params = ['openid' => $openId];
-
-        return $this->parseJSON('json', [self::API_GROUP, $params]);
-    }
-
-    /**
-     * Get black list.
-     *
-     * @param string|null $beginOpenid
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function blacklist($beginOpenid = null)
-    {
-        $params = ['begin_openid' => $beginOpenid];
-
-        return $this->parseJSON('json', [self::API_GET_BLACK_LIST, $params]);
-    }
-
-    /**
-     * Batch block user.
-     *
-     * @param array $openidList
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function batchBlock(array $openidList)
-    {
-        $params = ['openid_list' => $openidList];
-
-        return $this->parseJSON('json', [self::API_BATCH_BLACK_LIST, $params]);
-    }
-
-    /**
-     * Batch unblock user.
-     *
-     * @param array $openidList
-     *
-     * @return \EasyWeChat\Support\Collection
-     */
-    public function batchUnblock(array $openidList)
-    {
-        $params = ['openid_list' => $openidList];
-
-        return $this->parseJSON('json', [self::API_BATCH_UNBLACK_LIST, $params]);
-    }
-}
diff --git a/vendor/overtrue/wechat/src/User/composer.json b/vendor/overtrue/wechat/src/User/composer.json
deleted file mode 100644
index eff801b..0000000
--- a/vendor/overtrue/wechat/src/User/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "easywechat/user",
-    "description": "user module for EasyWeChat SDK.",
-    "keywords": ["wechat", "weixin", "SDK", "user", "easywechat"],
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "overtrue",
-            "email": "anzhengchao@gmail.com"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "EasyWeChat\\User\\": "."
-        }
-    },
-    "minimum-stability":"dev",
-    "require-dev": {
-        "phpunit/phpunit": "4.8.*",
-        "mockery/mockery": "^1.0@dev"
-    },
-    "require": {
-        "easywechat/core" : "dev-master"
-    }
-}
diff --git a/vendor/paragonie/random_compat/LICENSE b/vendor/paragonie/random_compat/LICENSE
deleted file mode 100644
index 45c7017..0000000
--- a/vendor/paragonie/random_compat/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Paragon Initiative Enterprises
-
-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.
-
diff --git a/vendor/paragonie/random_compat/build-phar.sh b/vendor/paragonie/random_compat/build-phar.sh
deleted file mode 100644
index b4a5ba3..0000000
--- a/vendor/paragonie/random_compat/build-phar.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env bash
-
-basedir=$( dirname $( readlink -f ${BASH_SOURCE[0]} ) )
-
-php -dphar.readonly=0 "$basedir/other/build_phar.php" $*
\ No newline at end of file
diff --git a/vendor/paragonie/random_compat/composer.json b/vendor/paragonie/random_compat/composer.json
deleted file mode 100644
index 1fa8de9..0000000
--- a/vendor/paragonie/random_compat/composer.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "name":         "paragonie/random_compat",
-  "description":  "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
-  "keywords": [
-    "csprng",
-    "random",
-    "polyfill",
-    "pseudorandom"
-  ],
-  "license":      "MIT",
-  "type":         "library",
-  "authors": [
-    {
-      "name":     "Paragon Initiative Enterprises",
-      "email":    "security@paragonie.com",
-      "homepage": "https://paragonie.com"
-    }
-  ],
-  "support": {
-    "issues":     "https://github.com/paragonie/random_compat/issues",
-    "email":      "info@paragonie.com",
-    "source":     "https://github.com/paragonie/random_compat"
-  },
-  "require": {
-    "php": "^7"
-  },
-  "require-dev": {
-    "vimeo/psalm": "^1",
-    "phpunit/phpunit": "4.*|5.*"
-  },
-  "suggest": {
-    "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
-  }
-}
diff --git a/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey b/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey
deleted file mode 100644
index eb50ebf..0000000
--- a/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey
+++ /dev/null
@@ -1,5 +0,0 @@
------BEGIN PUBLIC KEY-----
-MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEd+wCqJDrx5B4OldM0dQE0ZMX+lx1ZWm
-pui0SUqD4G29L3NGsz9UhJ/0HjBdbnkhIK5xviT0X5vtjacF6ajgcCArbTB+ds+p
-+h7Q084NuSuIpNb6YPfoUFgC/CL9kAoc
------END PUBLIC KEY-----
diff --git a/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc b/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc
deleted file mode 100644
index 6a1d7f3..0000000
--- a/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc
+++ /dev/null
@@ -1,11 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v2.0.22 (MingW32)
-
-iQEcBAABAgAGBQJWtW1hAAoJEGuXocKCZATaJf0H+wbZGgskK1dcRTsuVJl9IWip
-QwGw/qIKI280SD6/ckoUMxKDCJiFuPR14zmqnS36k7N5UNPnpdTJTS8T11jttSpg
-1LCmgpbEIpgaTah+cELDqFCav99fS+bEiAL5lWDAHBTE/XPjGVCqeehyPYref4IW
-NDBIEsvnHPHPLsn6X5jq4+Yj5oUixgxaMPiR+bcO4Sh+RzOVB6i2D0upWfRXBFXA
-NNnsg9/zjvoC7ZW73y9uSH+dPJTt/Vgfeiv52/v41XliyzbUyLalf02GNPY+9goV
-JHG1ulEEBJOCiUD9cE1PUIJwHA/HqyhHIvV350YoEFiHl8iSwm7SiZu5kPjaq74=
-=B6+8
------END PGP SIGNATURE-----
diff --git a/vendor/paragonie/random_compat/lib/random.php b/vendor/paragonie/random_compat/lib/random.php
deleted file mode 100644
index c7731a5..0000000
--- a/vendor/paragonie/random_compat/lib/random.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * Random_* Compatibility Library
- * for using the new PHP 7 random_* API in PHP 5 projects
- *
- * @version 2.99.99
- * @released 2018-06-06
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
- *
- * 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.
- */
-
-// NOP
diff --git a/vendor/paragonie/random_compat/other/build_phar.php b/vendor/paragonie/random_compat/other/build_phar.php
deleted file mode 100644
index 70ef4b2..0000000
--- a/vendor/paragonie/random_compat/other/build_phar.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-$dist = dirname(__DIR__).'/dist';
-if (!is_dir($dist)) {
-    mkdir($dist, 0755);
-}
-if (file_exists($dist.'/random_compat.phar')) {
-    unlink($dist.'/random_compat.phar');
-}
-$phar = new Phar(
-    $dist.'/random_compat.phar',
-    FilesystemIterator::CURRENT_AS_FILEINFO | \FilesystemIterator::KEY_AS_FILENAME,
-    'random_compat.phar'
-);
-rename(
-    dirname(__DIR__).'/lib/random.php', 
-    dirname(__DIR__).'/lib/index.php'
-);
-$phar->buildFromDirectory(dirname(__DIR__).'/lib');
-rename(
-    dirname(__DIR__).'/lib/index.php', 
-    dirname(__DIR__).'/lib/random.php'
-);
-
-/**
- * If we pass an (optional) path to a private key as a second argument, we will
- * sign the Phar with OpenSSL.
- * 
- * If you leave this out, it will produce an unsigned .phar!
- */
-if ($argc > 1) {
-    if (!@is_readable($argv[1])) {
-        echo 'Could not read the private key file:', $argv[1], "\n";
-        exit(255);
-    }
-    $pkeyFile = file_get_contents($argv[1]);
-    
-    $private = openssl_get_privatekey($pkeyFile);
-    if ($private !== false) {
-        $pkey = '';
-        openssl_pkey_export($private, $pkey);
-        $phar->setSignatureAlgorithm(Phar::OPENSSL, $pkey);
-        
-        /**
-         * Save the corresponding public key to the file
-         */
-        if (!@is_readable($dist.'/random_compat.phar.pubkey')) {
-            $details = openssl_pkey_get_details($private);
-            file_put_contents(
-                $dist.'/random_compat.phar.pubkey',
-                $details['key']
-            );
-        }
-    } else {
-        echo 'An error occurred reading the private key from OpenSSL.', "\n";
-        exit(255);
-    }
-}
diff --git a/vendor/paragonie/random_compat/psalm-autoload.php b/vendor/paragonie/random_compat/psalm-autoload.php
deleted file mode 100644
index d71d1b8..0000000
--- a/vendor/paragonie/random_compat/psalm-autoload.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-require_once 'lib/byte_safe_strings.php';
-require_once 'lib/cast_to_int.php';
-require_once 'lib/error_polyfill.php';
-require_once 'other/ide_stubs/libsodium.php';
-require_once 'lib/random.php';
-
-$int = random_int(0, 65536);
diff --git a/vendor/paragonie/random_compat/psalm.xml b/vendor/paragonie/random_compat/psalm.xml
deleted file mode 100644
index 596d99d..0000000
--- a/vendor/paragonie/random_compat/psalm.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0"?>
-<psalm
-    autoloader="psalm-autoload.php"
-    stopOnFirstError="false"
-    useDocblockTypes="true"
->
-    <projectFiles>
-        <directory name="lib" />
-    </projectFiles>
-    <issueHandlers>
-        <RedundantConditionGivenDocblockType errorLevel="info" />
-        <UnresolvableInclude errorLevel="info" />
-        <DuplicateClass errorLevel="info" />
-        <InvalidOperand errorLevel="info" />
-        <UndefinedConstant errorLevel="info" />
-        <MissingReturnType errorLevel="info" />
-        <InvalidReturnType errorLevel="info" />
-    </issueHandlers>
-</psalm>
diff --git a/vendor/psr/log/Psr/Log/LoggerInterface.php b/vendor/psr/log/Psr/Log/LoggerInterface.php
index 5ea7243..e695046 100644
--- a/vendor/psr/log/Psr/Log/LoggerInterface.php
+++ b/vendor/psr/log/Psr/Log/LoggerInterface.php
@@ -118,6 +118,8 @@ interface LoggerInterface
      * @param array  $context
      *
      * @return void
+     *
+     * @throws \Psr\Log\InvalidArgumentException
      */
     public function log($level, $message, array $context = array());
 }
diff --git a/vendor/psr/log/Psr/Log/LoggerTrait.php b/vendor/psr/log/Psr/Log/LoggerTrait.php
index 867225d..e392fef 100644
--- a/vendor/psr/log/Psr/Log/LoggerTrait.php
+++ b/vendor/psr/log/Psr/Log/LoggerTrait.php
@@ -135,6 +135,8 @@ trait LoggerTrait
      * @param array  $context
      *
      * @return void
+     *
+     * @throws \Psr\Log\InvalidArgumentException
      */
     abstract public function log($level, $message, array $context = array());
 }
diff --git a/vendor/psr/log/Psr/Log/NullLogger.php b/vendor/psr/log/Psr/Log/NullLogger.php
index d8cd682..c8f7293 100644
--- a/vendor/psr/log/Psr/Log/NullLogger.php
+++ b/vendor/psr/log/Psr/Log/NullLogger.php
@@ -20,6 +20,8 @@ class NullLogger extends AbstractLogger
      * @param array  $context
      *
      * @return void
+     *
+     * @throws \Psr\Log\InvalidArgumentException
      */
     public function log($level, $message, array $context = array())
     {
diff --git a/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php b/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php
index 4b861c3..9ecb6c4 100644
--- a/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php
+++ b/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php
@@ -4,6 +4,7 @@ namespace Psr\Log\Test;
 
 use Psr\Log\LoggerInterface;
 use Psr\Log\LogLevel;
+use PHPUnit\Framework\TestCase;
 
 /**
  * Provides a base test class for ensuring compliance with the LoggerInterface.
@@ -11,7 +12,7 @@ use Psr\Log\LogLevel;
  * Implementors can extend the class and implement abstract methods to run this
  * as part of their test suite.
  */
-abstract class LoggerInterfaceTest extends \PHPUnit_Framework_TestCase
+abstract class LoggerInterfaceTest extends TestCase
 {
     /**
      * @return LoggerInterface
@@ -140,5 +141,6 @@ class DummyTest
 {
     public function __toString()
     {
+        return 'DummyTest';
     }
 }
diff --git a/vendor/psr/log/Psr/Log/Test/TestLogger.php b/vendor/psr/log/Psr/Log/Test/TestLogger.php
index 0cdffe4..1be3230 100644
--- a/vendor/psr/log/Psr/Log/Test/TestLogger.php
+++ b/vendor/psr/log/Psr/Log/Test/TestLogger.php
@@ -142,5 +142,6 @@ class TestLogger extends AbstractLogger
     public function reset()
     {
         $this->records = [];
+        $this->recordsByLevel = [];
     }
 }
diff --git a/vendor/psr/log/README.md b/vendor/psr/log/README.md
index 5571a25..a9f20c4 100644
--- a/vendor/psr/log/README.md
+++ b/vendor/psr/log/README.md
@@ -38,6 +38,12 @@ class Foo
         if ($this->logger) {
             $this->logger->info('Doing work');
         }
+           
+        try {
+            $this->doSomethingElse();
+        } catch (Exception $exception) {
+            $this->logger->error('Oh no!', array('exception' => $exception));
+        }
 
         // do something useful
     }
diff --git a/vendor/psr/log/composer.json b/vendor/psr/log/composer.json
index 87934d7..3f6d4ee 100644
--- a/vendor/psr/log/composer.json
+++ b/vendor/psr/log/composer.json
@@ -20,7 +20,7 @@
     },
     "extra": {
         "branch-alias": {
-            "dev-master": "1.0.x-dev"
+            "dev-master": "1.1.x-dev"
         }
     }
 }
diff --git a/vendor/symfony/http-foundation/AcceptHeader.php b/vendor/symfony/http-foundation/AcceptHeader.php
index 968b71f..3f5fbb8 100644
--- a/vendor/symfony/http-foundation/AcceptHeader.php
+++ b/vendor/symfony/http-foundation/AcceptHeader.php
@@ -52,12 +52,17 @@ class AcceptHeader
     {
         $index = 0;
 
-        return new self(array_map(function ($itemValue) use (&$index) {
-            $item = AcceptHeaderItem::fromString($itemValue);
+        $parts = HeaderUtils::split((string) $headerValue, ',;=');
+
+        return new self(array_map(function ($subParts) use (&$index) {
+            $part = array_shift($subParts);
+            $attributes = HeaderUtils::combine($subParts);
+
+            $item = new AcceptHeaderItem($part[0], $attributes);
             $item->setIndex($index++);
 
             return $item;
-        }, preg_split('/\s*(?:,*("[^"]+"),*|,*(\'[^\']+\'),*|,+)\s*/', $headerValue, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)));
+        }, $parts));
     }
 
     /**
@@ -91,7 +96,7 @@ class AcceptHeader
      */
     public function get($value)
     {
-        return isset($this->items[$value]) ? $this->items[$value] : null;
+        return $this->items[$value] ?? $this->items[explode('/', $value)[0].'/*'] ?? $this->items['*/*'] ?? $this->items['*'] ?? null;
     }
 
     /**
diff --git a/vendor/symfony/http-foundation/AcceptHeaderItem.php b/vendor/symfony/http-foundation/AcceptHeaderItem.php
index f6e8968..954aac6 100644
--- a/vendor/symfony/http-foundation/AcceptHeaderItem.php
+++ b/vendor/symfony/http-foundation/AcceptHeaderItem.php
@@ -23,11 +23,7 @@ class AcceptHeaderItem
     private $index = 0;
     private $attributes = [];
 
-    /**
-     * @param string $value
-     * @param array  $attributes
-     */
-    public function __construct($value, array $attributes = [])
+    public function __construct(string $value, array $attributes = [])
     {
         $this->value = $value;
         foreach ($attributes as $name => $value) {
@@ -44,24 +40,12 @@ class AcceptHeaderItem
      */
     public static function fromString($itemValue)
     {
-        $bits = preg_split('/\s*(?:;*("[^"]+");*|;*(\'[^\']+\');*|;+)\s*/', $itemValue, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
-        $value = array_shift($bits);
-        $attributes = [];
-
-        $lastNullAttribute = null;
-        foreach ($bits as $bit) {
-            if (($start = substr($bit, 0, 1)) === ($end = substr($bit, -1)) && ('"' === $start || '\'' === $start)) {
-                $attributes[$lastNullAttribute] = substr($bit, 1, -1);
-            } elseif ('=' === $end) {
-                $lastNullAttribute = $bit = substr($bit, 0, -1);
-                $attributes[$bit] = null;
-            } else {
-                $parts = explode('=', $bit);
-                $attributes[$parts[0]] = isset($parts[1]) && \strlen($parts[1]) > 0 ? $parts[1] : '';
-            }
-        }
+        $parts = HeaderUtils::split($itemValue, ';=');
+
+        $part = array_shift($parts);
+        $attributes = HeaderUtils::combine($parts);
 
-        return new self(($start = substr($value, 0, 1)) === ($end = substr($value, -1)) && ('"' === $start || '\'' === $start) ? substr($value, 1, -1) : $value, $attributes);
+        return new self($part[0], $attributes);
     }
 
     /**
@@ -73,9 +57,7 @@ class AcceptHeaderItem
     {
         $string = $this->value.($this->quality < 1 ? ';q='.$this->quality : '');
         if (\count($this->attributes) > 0) {
-            $string .= ';'.implode(';', array_map(function ($name, $value) {
-                return sprintf(preg_match('/[,;=]/', $value) ? '%s="%s"' : '%s=%s', $name, $value);
-            }, array_keys($this->attributes), $this->attributes));
+            $string .= '; '.HeaderUtils::toString($this->attributes, ';');
         }
 
         return $string;
diff --git a/vendor/symfony/http-foundation/BinaryFileResponse.php b/vendor/symfony/http-foundation/BinaryFileResponse.php
index 6c9a995..de3c159 100644
--- a/vendor/symfony/http-foundation/BinaryFileResponse.php
+++ b/vendor/symfony/http-foundation/BinaryFileResponse.php
@@ -44,7 +44,7 @@ class BinaryFileResponse extends Response
      * @param bool                $autoEtag           Whether the ETag header should be automatically set
      * @param bool                $autoLastModified   Whether the Last-Modified header should be automatically set
      */
-    public function __construct($file, $status = 200, $headers = [], $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true)
+    public function __construct($file, int $status = 200, array $headers = [], bool $public = true, string $contentDisposition = null, bool $autoEtag = false, bool $autoLastModified = true)
     {
         parent::__construct(null, $status, $headers);
 
@@ -218,21 +218,16 @@ class BinaryFileResponse extends Response
             if ('x-accel-redirect' === strtolower($type)) {
                 // Do X-Accel-Mapping substitutions.
                 // @link http://wiki.nginx.org/X-accel#X-Accel-Redirect
-                foreach (explode(',', $request->headers->get('X-Accel-Mapping', '')) as $mapping) {
-                    $mapping = explode('=', $mapping, 2);
-
-                    if (2 === \count($mapping)) {
-                        $pathPrefix = trim($mapping[0]);
-                        $location = trim($mapping[1]);
-
-                        if (substr($path, 0, \strlen($pathPrefix)) === $pathPrefix) {
-                            $path = $location.substr($path, \strlen($pathPrefix));
-                            // Only set X-Accel-Redirect header if a valid URI can be produced
-                            // as nginx does not serve arbitrary file paths.
-                            $this->headers->set($type, $path);
-                            $this->maxlen = 0;
-                            break;
-                        }
+                $parts = HeaderUtils::split($request->headers->get('X-Accel-Mapping', ''), ',=');
+                foreach ($parts as $part) {
+                    list($pathPrefix, $location) = $part;
+                    if (substr($path, 0, \strlen($pathPrefix)) === $pathPrefix) {
+                        $path = $location.substr($path, \strlen($pathPrefix));
+                        // Only set X-Accel-Redirect header if a valid URI can be produced
+                        // as nginx does not serve arbitrary file paths.
+                        $this->headers->set($type, $path);
+                        $this->maxlen = 0;
+                        break;
                     }
                 }
             } else {
@@ -327,12 +322,12 @@ class BinaryFileResponse extends Response
         if (null !== $content) {
             throw new \LogicException('The content cannot be set on a BinaryFileResponse instance.');
         }
+
+        return $this;
     }
 
     /**
      * {@inheritdoc}
-     *
-     * @return false
      */
     public function getContent()
     {
@@ -355,7 +350,7 @@ class BinaryFileResponse extends Response
      *
      * @return $this
      */
-    public function deleteFileAfterSend($shouldDelete)
+    public function deleteFileAfterSend($shouldDelete = true)
     {
         $this->deleteFileAfterSend = $shouldDelete;
 
diff --git a/vendor/symfony/http-foundation/CHANGELOG.md b/vendor/symfony/http-foundation/CHANGELOG.md
index 7bfde80..1ce01ae 100644
--- a/vendor/symfony/http-foundation/CHANGELOG.md
+++ b/vendor/symfony/http-foundation/CHANGELOG.md
@@ -1,12 +1,69 @@
 CHANGELOG
 =========
 
-3.4.14
-------
+4.3.0
+-----
+
+ * added PHPUnit constraints: `RequestAttributeValueSame`, `ResponseCookieValueSame`, `ResponseHasCookie`,
+   `ResponseHasHeader`, `ResponseHeaderSame`, `ResponseIsRedirected`, `ResponseIsSuccessful`, and `ResponseStatusCodeSame`
+ * deprecated `MimeTypeGuesserInterface` and `ExtensionGuesserInterface` in favor of `Symfony\Component\Mime\MimeTypesInterface`.
+ * deprecated `MimeType` and `MimeTypeExtensionGuesser` in favor of `Symfony\Component\Mime\MimeTypes`.
+ * deprecated `FileBinaryMimeTypeGuesser` in favor of `Symfony\Component\Mime\FileBinaryMimeTypeGuesser`.
+ * deprecated `FileinfoMimeTypeGuesser` in favor of `Symfony\Component\Mime\FileinfoMimeTypeGuesser`.
+ * added `UrlHelper` that allows to get an absolute URL and a relative path for a given path
+
+4.2.0
+-----
+
+ * the default value of the "$secure" and "$samesite" arguments of Cookie's constructor
+   will respectively change from "false" to "null" and from "null" to "lax" in Symfony
+   5.0, you should define their values explicitly or use "Cookie::create()" instead.
+ * added `matchPort()` in RequestMatcher
+
+4.1.3
+-----
 
  * [BC BREAK] Support for the IIS-only `X_ORIGINAL_URL` and `X_REWRITE_URL`
    HTTP headers has been dropped for security reasons.
 
+4.1.0
+-----
+
+ * Query string normalization uses `parse_str()` instead of custom parsing logic.
+ * Passing the file size to the constructor of the `UploadedFile` class is deprecated.
+ * The `getClientSize()` method of the `UploadedFile` class is deprecated. Use `getSize()` instead.
+ * added `RedisSessionHandler` to use Redis as a session storage
+ * The `get()` method of the `AcceptHeader` class now takes into account the
+   `*` and `*/*` default values (if they are present in the Accept HTTP header)
+   when looking for items.
+ * deprecated `Request::getSession()` when no session has been set. Use `Request::hasSession()` instead.
+ * added `CannotWriteFileException`, `ExtensionFileException`, `FormSizeFileException`,
+   `IniSizeFileException`, `NoFileException`, `NoTmpDirFileException`, `PartialFileException` to
+   handle failed `UploadedFile`.
+ * added `MigratingSessionHandler` for migrating between two session handlers without losing sessions
+ * added `HeaderUtils`.
+
+4.0.0
+-----
+
+ * the `Request::setTrustedHeaderName()` and `Request::getTrustedHeaderName()`
+   methods have been removed
+ * the `Request::HEADER_CLIENT_IP` constant has been removed, use
+   `Request::HEADER_X_FORWARDED_FOR` instead
+ * the `Request::HEADER_CLIENT_HOST` constant has been removed, use
+   `Request::HEADER_X_FORWARDED_HOST` instead
+ * the `Request::HEADER_CLIENT_PROTO` constant has been removed, use
+   `Request::HEADER_X_FORWARDED_PROTO` instead
+ * the `Request::HEADER_CLIENT_PORT` constant has been removed, use
+   `Request::HEADER_X_FORWARDED_PORT` instead
+ * checking for cacheable HTTP methods using the `Request::isMethodSafe()`
+   method (by not passing `false` as its argument) is not supported anymore and
+   throws a `\BadMethodCallException`
+ * the `WriteCheckSessionHandler`, `NativeSessionHandler` and `NativeProxy` classes have been removed
+ * setting session save handlers that do not implement `\SessionHandlerInterface` in
+   `NativeSessionStorage::setSaveHandler()` is not supported anymore and throws a
+   `\TypeError`
+
 3.4.0
 -----
 
@@ -21,7 +78,7 @@ CHANGELOG
 -----
 
  * the `Request::setTrustedProxies()` method takes a new `$trustedHeaderSet` argument,
-   see http://symfony.com/doc/current/components/http_foundation/trusting_proxies.html for more info,
+   see https://symfony.com/doc/current/deployment/proxies.html for more info,
  * deprecated the `Request::setTrustedHeaderName()` and `Request::getTrustedHeaderName()` methods,
  * added `File\Stream`, to be passed to `BinaryFileResponse` when the size of the served file is unknown,
    disabling `Range` and `Content-Length` handling, switching to chunked encoding instead
diff --git a/vendor/symfony/http-foundation/Cookie.php b/vendor/symfony/http-foundation/Cookie.php
index 83a9708..1e22c74 100644
--- a/vendor/symfony/http-foundation/Cookie.php
+++ b/vendor/symfony/http-foundation/Cookie.php
@@ -18,6 +18,10 @@ namespace Symfony\Component\HttpFoundation;
  */
 class Cookie
 {
+    const SAMESITE_NONE = 'none';
+    const SAMESITE_LAX = 'lax';
+    const SAMESITE_STRICT = 'strict';
+
     protected $name;
     protected $value;
     protected $domain;
@@ -25,12 +29,14 @@ class Cookie
     protected $path;
     protected $secure;
     protected $httpOnly;
+
     private $raw;
     private $sameSite;
+    private $secureDefault = false;
 
-    const SAMESITE_NONE = 'none';
-    const SAMESITE_LAX = 'lax';
-    const SAMESITE_STRICT = 'strict';
+    private static $reservedCharsList = "=,; \t\r\n\v\f";
+    private static $reservedCharsFrom = ['=', ',', ';', ' ', "\t", "\r", "\n", "\v", "\f"];
+    private static $reservedCharsTo = ['%3D', '%2C', '%3B', '%20', '%09', '%0D', '%0A', '%0B', '%0C'];
 
     /**
      * Creates cookie from raw header string.
@@ -51,34 +57,25 @@ class Cookie
             'raw' => !$decode,
             'samesite' => null,
         ];
-        foreach (explode(';', $cookie) as $part) {
-            if (false === strpos($part, '=')) {
-                $key = trim($part);
-                $value = true;
-            } else {
-                list($key, $value) = explode('=', trim($part), 2);
-                $key = trim($key);
-                $value = trim($value);
-            }
-            if (!isset($data['name'])) {
-                $data['name'] = $decode ? urldecode($key) : $key;
-                $data['value'] = true === $value ? null : ($decode ? urldecode($value) : $value);
-                continue;
-            }
-            switch ($key = strtolower($key)) {
-                case 'name':
-                case 'value':
-                    break;
-                case 'max-age':
-                    $data['expires'] = time() + (int) $value;
-                    break;
-                default:
-                    $data[$key] = $value;
-                    break;
-            }
+
+        $parts = HeaderUtils::split($cookie, ';=');
+        $part = array_shift($parts);
+
+        $name = $decode ? urldecode($part[0]) : $part[0];
+        $value = isset($part[1]) ? ($decode ? urldecode($part[1]) : $part[1]) : null;
+
+        $data = HeaderUtils::combine($parts) + $data;
+
+        if (isset($data['max-age'])) {
+            $data['expires'] = time() + (int) $data['max-age'];
         }
 
-        return new static($data['name'], $data['value'], $data['expires'], $data['path'], $data['domain'], $data['secure'], $data['httponly'], $data['raw'], $data['samesite']);
+        return new static($name, $value, $data['expires'], $data['path'], $data['domain'], $data['secure'], $data['httponly'], $data['raw'], $data['samesite']);
+    }
+
+    public static function create(string $name, string $value = null, $expire = 0, ?string $path = '/', string $domain = null, bool $secure = null, bool $httpOnly = true, bool $raw = false, ?string $sameSite = self::SAMESITE_LAX): self
+    {
+        return new self($name, $value, $expire, $path, $domain, $secure, $httpOnly, $raw, $sameSite);
     }
 
     /**
@@ -87,17 +84,21 @@ class Cookie
      * @param int|string|\DateTimeInterface $expire   The time the cookie expires
      * @param string                        $path     The path on the server in which the cookie will be available on
      * @param string|null                   $domain   The domain that the cookie is available to
-     * @param bool                          $secure   Whether the cookie should only be transmitted over a secure HTTPS connection from the client
+     * @param bool|null                     $secure   Whether the client should send back the cookie only over HTTPS or null to auto-enable this when the request is already using HTTPS
      * @param bool                          $httpOnly Whether the cookie will be made accessible only through the HTTP protocol
      * @param bool                          $raw      Whether the cookie value should be sent with no url encoding
      * @param string|null                   $sameSite Whether the cookie will be available for cross-site requests
      *
      * @throws \InvalidArgumentException
      */
-    public function __construct($name, $value = null, $expire = 0, $path = '/', $domain = null, $secure = false, $httpOnly = true, $raw = false, $sameSite = null)
+    public function __construct(string $name, string $value = null, $expire = 0, ?string $path = '/', string $domain = null, ?bool $secure = false, bool $httpOnly = true, bool $raw = false, string $sameSite = null)
     {
+        if (9 > \func_num_args()) {
+            @trigger_error(sprintf('The default value of the "$secure" and "$samesite" arguments of "%s"\'s constructor will respectively change from "false" to "null" and from "null" to "lax" in Symfony 5.0, you should define their values explicitly or use "Cookie::create()" instead.', __METHOD__), E_USER_DEPRECATED);
+        }
+
         // from PHP source code
-        if (preg_match("/[=,; \t\r\n\013\014]/", $name)) {
+        if ($raw && false !== strpbrk($name, self::$reservedCharsList)) {
             throw new \InvalidArgumentException(sprintf('The cookie name "%s" contains invalid characters.', $name));
         }
 
@@ -121,11 +122,13 @@ class Cookie
         $this->domain = $domain;
         $this->expire = 0 < $expire ? (int) $expire : 0;
         $this->path = empty($path) ? '/' : $path;
-        $this->secure = (bool) $secure;
-        $this->httpOnly = (bool) $httpOnly;
-        $this->raw = (bool) $raw;
+        $this->secure = $secure;
+        $this->httpOnly = $httpOnly;
+        $this->raw = $raw;
 
-        if (null !== $sameSite) {
+        if ('' === $sameSite) {
+            $sameSite = null;
+        } elseif (null !== $sameSite) {
             $sameSite = strtolower($sameSite);
         }
 
@@ -143,7 +146,13 @@ class Cookie
      */
     public function __toString()
     {
-        $str = ($this->isRaw() ? $this->getName() : urlencode($this->getName())).'=';
+        if ($this->isRaw()) {
+            $str = $this->getName();
+        } else {
+            $str = str_replace(self::$reservedCharsFrom, self::$reservedCharsTo, $this->getName());
+        }
+
+        $str .= '=';
 
         if ('' === (string) $this->getValue()) {
             $str .= 'deleted; expires='.gmdate('D, d-M-Y H:i:s T', time() - 31536001).'; Max-Age=0';
@@ -247,7 +256,7 @@ class Cookie
      */
     public function isSecure()
     {
-        return $this->secure;
+        return $this->secure ?? $this->secureDefault;
     }
 
     /**
@@ -289,4 +298,12 @@ class Cookie
     {
         return $this->sameSite;
     }
+
+    /**
+     * @param bool $default The default value of the "secure" flag when it is set to null
+     */
+    public function setSecureDefault(bool $default): void
+    {
+        $this->secureDefault = $default;
+    }
 }
diff --git a/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php b/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php
index 3b8e41d..c25c362 100644
--- a/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php
+++ b/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php
@@ -21,7 +21,7 @@ class AccessDeniedException extends FileException
     /**
      * @param string $path The path to the accessed file
      */
-    public function __construct($path)
+    public function __construct(string $path)
     {
         parent::__construct(sprintf('The file %s could not be accessed', $path));
     }
diff --git a/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php b/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php
index bfcc37e..0f1f3f9 100644
--- a/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php
+++ b/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php
@@ -21,7 +21,7 @@ class FileNotFoundException extends FileException
     /**
      * @param string $path The path to the file that was not found
      */
-    public function __construct($path)
+    public function __construct(string $path)
     {
         parent::__construct(sprintf('The file "%s" does not exist', $path));
     }
diff --git a/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php b/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php
index 62005d3..82b982b 100644
--- a/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php
+++ b/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php
@@ -13,7 +13,7 @@ namespace Symfony\Component\HttpFoundation\File\Exception;
 
 class UnexpectedTypeException extends FileException
 {
-    public function __construct($value, $expectedType)
+    public function __construct($value, string $expectedType)
     {
         parent::__construct(sprintf('Expected argument of type %s, %s given', $expectedType, \is_object($value) ? \get_class($value) : \gettype($value)));
     }
diff --git a/vendor/symfony/http-foundation/File/File.php b/vendor/symfony/http-foundation/File/File.php
index 3422058..396ff34 100644
--- a/vendor/symfony/http-foundation/File/File.php
+++ b/vendor/symfony/http-foundation/File/File.php
@@ -13,8 +13,7 @@ namespace Symfony\Component\HttpFoundation\File;
 
 use Symfony\Component\HttpFoundation\File\Exception\FileException;
 use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
-use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
-use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
+use Symfony\Component\Mime\MimeTypes;
 
 /**
  * A file in the file system.
@@ -31,7 +30,7 @@ class File extends \SplFileInfo
      *
      * @throws FileNotFoundException If the given path is not a file
      */
-    public function __construct($path, $checkPath = true)
+    public function __construct(string $path, bool $checkPath = true)
     {
         if ($checkPath && !is_file($path)) {
             throw new FileNotFoundException($path);
@@ -50,33 +49,28 @@ class File extends \SplFileInfo
      *
      * @return string|null The guessed extension or null if it cannot be guessed
      *
-     * @see ExtensionGuesser
+     * @see MimeTypes
      * @see getMimeType()
      */
     public function guessExtension()
     {
-        $type = $this->getMimeType();
-        $guesser = ExtensionGuesser::getInstance();
-
-        return $guesser->guess($type);
+        return MimeTypes::getDefault()->getExtensions($this->getMimeType())[0] ?? null;
     }
 
     /**
      * Returns the mime type of the file.
      *
-     * The mime type is guessed using a MimeTypeGuesser instance, which uses finfo(),
-     * mime_content_type() and the system binary "file" (in this order), depending on
-     * which of those are available.
+     * The mime type is guessed using a MimeTypeGuesserInterface instance,
+     * which uses finfo_file() then the "file" system binary,
+     * depending on which of those are available.
      *
      * @return string|null The guessed mime type (e.g. "application/pdf")
      *
-     * @see MimeTypeGuesser
+     * @see MimeTypes
      */
     public function getMimeType()
     {
-        $guesser = MimeTypeGuesser::getInstance();
-
-        return $guesser->guess($this->getPathname());
+        return MimeTypes::getDefault()->guessMimeType($this->getPathname());
     }
 
     /**
diff --git a/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesser.php b/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesser.php
index 80f4d47..4ac2013 100644
--- a/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesser.php
+++ b/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesser.php
@@ -11,6 +11,10 @@
 
 namespace Symfony\Component\HttpFoundation\File\MimeType;
 
+use Symfony\Component\Mime\MimeTypes;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.3, use "%s" instead.', ExtensionGuesser::class, MimeTypes::class), E_USER_DEPRECATED);
+
 /**
  * A singleton mime type to file extension guesser.
  *
@@ -22,6 +26,8 @@ namespace Symfony\Component\HttpFoundation\File\MimeType;
  *     $guesser->register(new MyCustomExtensionGuesser());
  *
  * The last registered guesser is preferred over previously registered ones.
+ *
+ * @deprecated since Symfony 4.3, use {@link MimeTypes} instead
  */
 class ExtensionGuesser implements ExtensionGuesserInterface
 {
@@ -90,5 +96,7 @@ class ExtensionGuesser implements ExtensionGuesserInterface
                 return $extension;
             }
         }
+
+        return null;
     }
 }
diff --git a/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesserInterface.php b/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesserInterface.php
index d19a0e5..69fe6ef 100644
--- a/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesserInterface.php
+++ b/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesserInterface.php
@@ -11,8 +11,12 @@
 
 namespace Symfony\Component\HttpFoundation\File\MimeType;
 
+use Symfony\Component\Mime\MimeTypesInterface;
+
 /**
  * Guesses the file extension corresponding to a given mime type.
+ *
+ * @deprecated since Symfony 4.3, use {@link MimeTypesInterface} instead
  */
 interface ExtensionGuesserInterface
 {
diff --git a/vendor/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php b/vendor/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php
index 34e015e..5d3ae10 100644
--- a/vendor/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php
+++ b/vendor/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php
@@ -13,11 +13,16 @@ namespace Symfony\Component\HttpFoundation\File\MimeType;
 
 use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
 use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
+use Symfony\Component\Mime\FileBinaryMimeTypeGuesser as NewFileBinaryMimeTypeGuesser;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.3, use "%s" instead.', FileBinaryMimeTypeGuesser::class, NewFileBinaryMimeTypeGuesser::class), E_USER_DEPRECATED);
 
 /**
  * Guesses the mime type with the binary "file" (only available on *nix).
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @deprecated since Symfony 4.3, use {@link NewFileBinaryMimeTypeGuesser} instead
  */
 class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface
 {
@@ -31,7 +36,7 @@ class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface
      *
      * @param string $cmd The command to run to get the mime type of a file
      */
-    public function __construct($cmd = 'file -b --mime %s 2>/dev/null')
+    public function __construct(string $cmd = 'file -b --mime -- %s 2>/dev/null')
     {
         $this->cmd = $cmd;
     }
@@ -74,24 +79,24 @@ class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface
         }
 
         if (!self::isSupported()) {
-            return;
+            return null;
         }
 
         ob_start();
 
         // need to use --mime instead of -i. see #6641
-        passthru(sprintf($this->cmd, escapeshellarg($path)), $return);
+        passthru(sprintf($this->cmd, escapeshellarg((0 === strpos($path, '-') ? './' : '').$path)), $return);
         if ($return > 0) {
             ob_end_clean();
 
-            return;
+            return null;
         }
 
         $type = trim(ob_get_clean());
 
-        if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\.]+)#i', $type, $match)) {
+        if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\+\.]+)#i', $type, $match)) {
             // it's not a type, but an error message
-            return;
+            return null;
         }
 
         return $match[1];
diff --git a/vendor/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php b/vendor/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php
index bf1ee9f..70a01d7 100644
--- a/vendor/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php
+++ b/vendor/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php
@@ -13,11 +13,16 @@ namespace Symfony\Component\HttpFoundation\File\MimeType;
 
 use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
 use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
+use Symfony\Component\Mime\FileinfoMimeTypeGuesser as NewFileinfoMimeTypeGuesser;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.3, use "%s" instead.', FileinfoMimeTypeGuesser::class, NewFileinfoMimeTypeGuesser::class), E_USER_DEPRECATED);
 
 /**
  * Guesses the mime type using the PECL extension FileInfo.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @deprecated since Symfony 4.3, use {@link NewFileinfoMimeTypeGuesser} instead
  */
 class FileinfoMimeTypeGuesser implements MimeTypeGuesserInterface
 {
@@ -26,9 +31,9 @@ class FileinfoMimeTypeGuesser implements MimeTypeGuesserInterface
     /**
      * @param string $magicFile A magic file to use with the finfo instance
      *
-     * @see http://www.php.net/manual/en/function.finfo-open.php
+     * @see https://php.net/finfo-open
      */
-    public function __construct($magicFile = null)
+    public function __construct(string $magicFile = null)
     {
         $this->magicFile = $magicFile;
     }
@@ -57,11 +62,11 @@ class FileinfoMimeTypeGuesser implements MimeTypeGuesserInterface
         }
 
         if (!self::isSupported()) {
-            return;
+            return null;
         }
 
         if (!$finfo = new \finfo(FILEINFO_MIME_TYPE, $this->magicFile)) {
-            return;
+            return null;
         }
 
         return $finfo->file($path);
diff --git a/vendor/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php b/vendor/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php
index c0f9140..651be07 100644
--- a/vendor/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php
+++ b/vendor/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php
@@ -11,8 +11,14 @@
 
 namespace Symfony\Component\HttpFoundation\File\MimeType;
 
+use Symfony\Component\Mime\MimeTypes;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.3, use "%s" instead.', MimeTypeExtensionGuesser::class, MimeTypes::class), E_USER_DEPRECATED);
+
 /**
  * Provides a best-guess mapping of mime type to file extension.
+ *
+ * @deprecated since Symfony 4.3, use {@link MimeTypes} instead
  */
 class MimeTypeExtensionGuesser implements ExtensionGuesserInterface
 {
@@ -639,6 +645,7 @@ class MimeTypeExtensionGuesser implements ExtensionGuesserInterface
         'audio/x-aiff' => 'aif',
         'audio/x-caf' => 'caf',
         'audio/x-flac' => 'flac',
+        'audio/x-hx-aac-adts' => 'aac',
         'audio/x-matroska' => 'mka',
         'audio/x-mpegurl' => 'm3u',
         'audio/x-ms-wax' => 'wax',
diff --git a/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php b/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php
index 95d1ee2..ece2109 100644
--- a/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php
+++ b/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php
@@ -13,6 +13,9 @@ namespace Symfony\Component\HttpFoundation\File\MimeType;
 
 use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
 use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
+use Symfony\Component\Mime\MimeTypes;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.3, use "%s" instead.', MimeTypeGuesser::class, MimeTypes::class), E_USER_DEPRECATED);
 
 /**
  * A singleton mime type guesser.
@@ -129,5 +132,7 @@ class MimeTypeGuesser implements MimeTypeGuesserInterface
         if (2 === \count($this->guessers) && !FileBinaryMimeTypeGuesser::isSupported() && !FileinfoMimeTypeGuesser::isSupported()) {
             throw new \LogicException('Unable to guess the mime type as no guessers are available (Did you enable the php_fileinfo extension?)');
         }
+
+        return null;
     }
 }
diff --git a/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php b/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php
index 5ac1acb..eab4448 100644
--- a/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php
+++ b/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php
@@ -13,11 +13,14 @@ namespace Symfony\Component\HttpFoundation\File\MimeType;
 
 use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
 use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
+use Symfony\Component\Mime\MimeTypesInterface;
 
 /**
  * Guesses the mime type of a file.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @deprecated since Symfony 4.3, use {@link MimeTypesInterface} instead
  */
 interface MimeTypeGuesserInterface
 {
@@ -26,7 +29,7 @@ interface MimeTypeGuesserInterface
      *
      * @param string $path The path to the file
      *
-     * @return string The mime type or NULL, if none could be guessed
+     * @return string|null The mime type or NULL, if none could be guessed
      *
      * @throws FileNotFoundException If the file does not exist
      * @throws AccessDeniedException If the file could not be read
diff --git a/vendor/symfony/http-foundation/File/UploadedFile.php b/vendor/symfony/http-foundation/File/UploadedFile.php
index a44c664..2367098 100644
--- a/vendor/symfony/http-foundation/File/UploadedFile.php
+++ b/vendor/symfony/http-foundation/File/UploadedFile.php
@@ -11,9 +11,16 @@
 
 namespace Symfony\Component\HttpFoundation\File;
 
+use Symfony\Component\HttpFoundation\File\Exception\CannotWriteFileException;
+use Symfony\Component\HttpFoundation\File\Exception\ExtensionFileException;
 use Symfony\Component\HttpFoundation\File\Exception\FileException;
 use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
-use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
+use Symfony\Component\HttpFoundation\File\Exception\FormSizeFileException;
+use Symfony\Component\HttpFoundation\File\Exception\IniSizeFileException;
+use Symfony\Component\HttpFoundation\File\Exception\NoFileException;
+use Symfony\Component\HttpFoundation\File\Exception\NoTmpDirFileException;
+use Symfony\Component\HttpFoundation\File\Exception\PartialFileException;
+use Symfony\Component\Mime\MimeTypes;
 
 /**
  * A file uploaded through a form.
@@ -27,7 +34,6 @@ class UploadedFile extends File
     private $test = false;
     private $originalName;
     private $mimeType;
-    private $size;
     private $error;
 
     /**
@@ -47,7 +53,6 @@ class UploadedFile extends File
      * @param string      $path         The full temporary path to the file
      * @param string      $originalName The original file name of the uploaded file
      * @param string|null $mimeType     The type of the file as provided by PHP; null defaults to application/octet-stream
-     * @param int|null    $size         The file size provided by the uploader
      * @param int|null    $error        The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants); null defaults to UPLOAD_ERR_OK
      * @param bool        $test         Whether the test mode is active
      *                                  Local files are used in test mode hence the code should not enforce HTTP uploads
@@ -55,13 +60,19 @@ class UploadedFile extends File
      * @throws FileException         If file_uploads is disabled
      * @throws FileNotFoundException If the file does not exist
      */
-    public function __construct($path, $originalName, $mimeType = null, $size = null, $error = null, $test = false)
+    public function __construct(string $path, string $originalName, string $mimeType = null, int $error = null, $test = false)
     {
         $this->originalName = $this->getName($originalName);
         $this->mimeType = $mimeType ?: 'application/octet-stream';
-        $this->size = $size;
+
+        if (4 < \func_num_args() ? !\is_bool($test) : null !== $error && @filesize($path) === $error) {
+            @trigger_error(sprintf('Passing a size as 4th argument to the constructor of "%s" is deprecated since Symfony 4.1.', __CLASS__), E_USER_DEPRECATED);
+            $error = $test;
+            $test = 5 < \func_num_args() ? func_get_arg(5) : false;
+        }
+
         $this->error = $error ?: UPLOAD_ERR_OK;
-        $this->test = (bool) $test;
+        $this->test = $test;
 
         parent::__construct($path, UPLOAD_ERR_OK === $this->error);
     }
@@ -129,10 +140,7 @@ class UploadedFile extends File
      */
     public function guessClientExtension()
     {
-        $type = $this->getClientMimeType();
-        $guesser = ExtensionGuesser::getInstance();
-
-        return $guesser->guess($type);
+        return MimeTypes::getDefault()->getExtensions($this->getClientMimeType())[0] ?? null;
     }
 
     /**
@@ -141,11 +149,15 @@ class UploadedFile extends File
      * It is extracted from the request from which the file has been uploaded.
      * Then it should not be considered as a safe value.
      *
-     * @return int|null The file size
+     * @deprecated since Symfony 4.1, use getSize() instead.
+     *
+     * @return int|null The file sizes
      */
     public function getClientSize()
     {
-        return $this->size;
+        @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.1. Use getSize() instead.', __METHOD__), E_USER_DEPRECATED);
+
+        return $this->getSize();
     }
 
     /**
@@ -204,6 +216,23 @@ class UploadedFile extends File
             return $target;
         }
 
+        switch ($this->error) {
+            case UPLOAD_ERR_INI_SIZE:
+                throw new IniSizeFileException($this->getErrorMessage());
+            case UPLOAD_ERR_FORM_SIZE:
+                throw new FormSizeFileException($this->getErrorMessage());
+            case UPLOAD_ERR_PARTIAL:
+                throw new PartialFileException($this->getErrorMessage());
+            case UPLOAD_ERR_NO_FILE:
+                throw new NoFileException($this->getErrorMessage());
+            case UPLOAD_ERR_CANT_WRITE:
+                throw new CannotWriteFileException($this->getErrorMessage());
+            case UPLOAD_ERR_NO_TMP_DIR:
+                throw new NoTmpDirFileException($this->getErrorMessage());
+            case UPLOAD_ERR_EXTENSION:
+                throw new ExtensionFileException($this->getErrorMessage());
+        }
+
         throw new FileException($this->getErrorMessage());
     }
 
@@ -214,13 +243,26 @@ class UploadedFile extends File
      */
     public static function getMaxFilesize()
     {
-        $iniMax = strtolower(ini_get('upload_max_filesize'));
+        $sizePostMax = self::parseFilesize(ini_get('post_max_size'));
+        $sizeUploadMax = self::parseFilesize(ini_get('upload_max_filesize'));
 
-        if ('' === $iniMax) {
-            return PHP_INT_MAX;
+        return min($sizePostMax ?: PHP_INT_MAX, $sizeUploadMax ?: PHP_INT_MAX);
+    }
+
+    /**
+     * Returns the given size from an ini value in bytes.
+     *
+     * @return int The given size in bytes
+     */
+    private static function parseFilesize($size)
+    {
+        if ('' === $size) {
+            return 0;
         }
 
-        $max = ltrim($iniMax, '+');
+        $size = strtolower($size);
+
+        $max = ltrim($size, '+');
         if (0 === strpos($max, '0x')) {
             $max = \intval($max, 16);
         } elseif (0 === strpos($max, '0')) {
@@ -229,7 +271,7 @@ class UploadedFile extends File
             $max = (int) $max;
         }
 
-        switch (substr($iniMax, -1)) {
+        switch (substr($size, -1)) {
             case 't': $max *= 1024;
             // no break
             case 'g': $max *= 1024;
diff --git a/vendor/symfony/http-foundation/FileBag.php b/vendor/symfony/http-foundation/FileBag.php
index ca849b3..f3248a5 100644
--- a/vendor/symfony/http-foundation/FileBag.php
+++ b/vendor/symfony/http-foundation/FileBag.php
@@ -75,8 +75,8 @@ class FileBag extends ParameterBag
             return $file;
         }
 
-        $file = $this->fixPhpFilesArray($file);
         if (\is_array($file)) {
+            $file = $this->fixPhpFilesArray($file);
             $keys = array_keys($file);
             sort($keys);
 
@@ -84,7 +84,7 @@ class FileBag extends ParameterBag
                 if (UPLOAD_ERR_NO_FILE == $file['error']) {
                     $file = null;
                 } else {
-                    $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type'], $file['size'], $file['error']);
+                    $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type'], $file['error'], false);
                 }
             } else {
                 $file = array_map([$this, 'convertFileInformation'], $file);
@@ -109,14 +109,12 @@ class FileBag extends ParameterBag
      * It's safe to pass an already converted array, in which case this method
      * just returns the original array unmodified.
      *
+     * @param array $data
+     *
      * @return array
      */
     protected function fixPhpFilesArray($data)
     {
-        if (!\is_array($data)) {
-            return $data;
-        }
-
         $keys = array_keys($data);
         sort($keys);
 
diff --git a/vendor/symfony/http-foundation/HeaderBag.php b/vendor/symfony/http-foundation/HeaderBag.php
index 9798173..7782f74 100644
--- a/vendor/symfony/http-foundation/HeaderBag.php
+++ b/vendor/symfony/http-foundation/HeaderBag.php
@@ -46,7 +46,7 @@ class HeaderBag implements \IteratorAggregate, \Countable
         $max = max(array_map('strlen', array_keys($headers))) + 1;
         $content = '';
         foreach ($headers as $name => $values) {
-            $name = implode('-', array_map('ucfirst', explode('-', $name)));
+            $name = ucwords($name, '-');
             foreach ($values as $value) {
                 $content .= sprintf("%-{$max}s %s\r\n", $name.':', $value);
             }
@@ -121,7 +121,15 @@ class HeaderBag implements \IteratorAggregate, \Countable
         }
 
         if ($first) {
-            return \count($headers[$key]) ? $headers[$key][0] : $default;
+            if (!$headers[$key]) {
+                return $default;
+            }
+
+            if (null === $headers[$key][0]) {
+                return null;
+            }
+
+            return (string) $headers[$key][0];
         }
 
         return $headers[$key];
@@ -294,21 +302,9 @@ class HeaderBag implements \IteratorAggregate, \Countable
 
     protected function getCacheControlHeader()
     {
-        $parts = [];
         ksort($this->cacheControl);
-        foreach ($this->cacheControl as $key => $value) {
-            if (true === $value) {
-                $parts[] = $key;
-            } else {
-                if (preg_match('#[^a-zA-Z0-9._-]#', $value)) {
-                    $value = '"'.$value.'"';
-                }
 
-                $parts[] = "$key=$value";
-            }
-        }
-
-        return implode(', ', $parts);
+        return HeaderUtils::toString($this->cacheControl, ',');
     }
 
     /**
@@ -320,12 +316,8 @@ class HeaderBag implements \IteratorAggregate, \Countable
      */
     protected function parseCacheControl($header)
     {
-        $cacheControl = [];
-        preg_match_all('#([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?#', $header, $matches, PREG_SET_ORDER);
-        foreach ($matches as $match) {
-            $cacheControl[strtolower($match[1])] = isset($match[3]) ? $match[3] : (isset($match[2]) ? $match[2] : true);
-        }
+        $parts = HeaderUtils::split($header, ',=');
 
-        return $cacheControl;
+        return HeaderUtils::combine($parts);
     }
 }
diff --git a/vendor/symfony/http-foundation/JsonResponse.php b/vendor/symfony/http-foundation/JsonResponse.php
index a9bdac3..11a0beb 100644
--- a/vendor/symfony/http-foundation/JsonResponse.php
+++ b/vendor/symfony/http-foundation/JsonResponse.php
@@ -39,7 +39,7 @@ class JsonResponse extends Response
      * @param array $headers An array of response headers
      * @param bool  $json    If the data is already a JSON string
      */
-    public function __construct($data = null, $status = 200, $headers = [], $json = false)
+    public function __construct($data = null, int $status = 200, array $headers = [], bool $json = false)
     {
         parent::__construct('', $status, $headers);
 
@@ -100,7 +100,7 @@ class JsonResponse extends Response
     public function setCallback($callback = null)
     {
         if (null !== $callback) {
-            // partially taken from http://www.geekality.net/2011/08/03/valid-javascript-identifier/
+            // partially taken from https://geekality.net/2011/08/03/valid-javascript-identifier/
             // partially taken from https://github.com/willdurand/JsonpCallbackValidator
             //      JsonpCallbackValidator is released under the MIT License. See https://github.com/willdurand/JsonpCallbackValidator/blob/v1.1.0/LICENSE for details.
             //      (c) William Durand <william.durand1@gmail.com>
@@ -150,33 +150,17 @@ class JsonResponse extends Response
      */
     public function setData($data = [])
     {
-        if (\defined('HHVM_VERSION')) {
-            // HHVM does not trigger any warnings and let exceptions
-            // thrown from a JsonSerializable object pass through.
-            // If only PHP did the same...
+        try {
             $data = json_encode($data, $this->encodingOptions);
-        } else {
-            if (!interface_exists('JsonSerializable', false)) {
-                set_error_handler(function () { return false; });
-                try {
-                    $data = @json_encode($data, $this->encodingOptions);
-                } finally {
-                    restore_error_handler();
-                }
-            } else {
-                try {
-                    $data = json_encode($data, $this->encodingOptions);
-                } catch (\Exception $e) {
-                    if ('Exception' === \get_class($e) && 0 === strpos($e->getMessage(), 'Failed calling ')) {
-                        throw $e->getPrevious() ?: $e;
-                    }
-                    throw $e;
-                }
-
-                if (\PHP_VERSION_ID >= 70300 && (JSON_THROW_ON_ERROR & $this->encodingOptions)) {
-                    return $this->setJson($data);
-                }
+        } catch (\Exception $e) {
+            if ('Exception' === \get_class($e) && 0 === strpos($e->getMessage(), 'Failed calling ')) {
+                throw $e->getPrevious() ?: $e;
             }
+            throw $e;
+        }
+
+        if (\PHP_VERSION_ID >= 70300 && (JSON_THROW_ON_ERROR & $this->encodingOptions)) {
+            return $this->setJson($data);
         }
 
         if (JSON_ERROR_NONE !== json_last_error()) {
diff --git a/vendor/symfony/http-foundation/ParameterBag.php b/vendor/symfony/http-foundation/ParameterBag.php
index f05e4a2..194ba2c 100644
--- a/vendor/symfony/http-foundation/ParameterBag.php
+++ b/vendor/symfony/http-foundation/ParameterBag.php
@@ -191,7 +191,7 @@ class ParameterBag implements \IteratorAggregate, \Countable
      * @param int    $filter  FILTER_* constant
      * @param mixed  $options Filter options
      *
-     * @see http://php.net/manual/en/function.filter-var.php
+     * @see https://php.net/filter-var
      *
      * @return mixed
      */
diff --git a/vendor/symfony/http-foundation/RedirectResponse.php b/vendor/symfony/http-foundation/RedirectResponse.php
index 51fd869..3abdf3e 100644
--- a/vendor/symfony/http-foundation/RedirectResponse.php
+++ b/vendor/symfony/http-foundation/RedirectResponse.php
@@ -30,9 +30,9 @@ class RedirectResponse extends Response
      *
      * @throws \InvalidArgumentException
      *
-     * @see http://tools.ietf.org/html/rfc2616#section-10.3
+     * @see https://tools.ietf.org/html/rfc2616#section-10.3
      */
-    public function __construct($url, $status = 302, $headers = [])
+    public function __construct(?string $url, int $status = 302, array $headers = [])
     {
         parent::__construct('', $status, $headers);
 
diff --git a/vendor/symfony/http-foundation/Request.php b/vendor/symfony/http-foundation/Request.php
index ea3f460..db82ffc 100644
--- a/vendor/symfony/http-foundation/Request.php
+++ b/vendor/symfony/http-foundation/Request.php
@@ -38,15 +38,6 @@ class Request
     const HEADER_X_FORWARDED_ALL = 0b11110; // All "X-Forwarded-*" headers
     const HEADER_X_FORWARDED_AWS_ELB = 0b11010; // AWS ELB doesn't send X-Forwarded-Host
 
-    /** @deprecated since version 3.3, to be removed in 4.0 */
-    const HEADER_CLIENT_IP = self::HEADER_X_FORWARDED_FOR;
-    /** @deprecated since version 3.3, to be removed in 4.0 */
-    const HEADER_CLIENT_HOST = self::HEADER_X_FORWARDED_HOST;
-    /** @deprecated since version 3.3, to be removed in 4.0 */
-    const HEADER_CLIENT_PROTO = self::HEADER_X_FORWARDED_PROTO;
-    /** @deprecated since version 3.3, to be removed in 4.0 */
-    const HEADER_CLIENT_PORT = self::HEADER_X_FORWARDED_PORT;
-
     const METHOD_HEAD = 'HEAD';
     const METHOD_GET = 'GET';
     const METHOD_POST = 'POST';
@@ -73,73 +64,54 @@ class Request
      */
     protected static $trustedHosts = [];
 
-    /**
-     * Names for headers that can be trusted when
-     * using trusted proxies.
-     *
-     * The FORWARDED header is the standard as of rfc7239.
-     *
-     * The other headers are non-standard, but widely used
-     * by popular reverse proxies (like Apache mod_proxy or Amazon EC2).
-     *
-     * @deprecated since version 3.3, to be removed in 4.0
-     */
-    protected static $trustedHeaders = [
-        self::HEADER_FORWARDED => 'FORWARDED',
-        self::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',
-        self::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST',
-        self::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
-        self::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT',
-    ];
-
     protected static $httpMethodParameterOverride = false;
 
     /**
      * Custom parameters.
      *
-     * @var \Symfony\Component\HttpFoundation\ParameterBag
+     * @var ParameterBag
      */
     public $attributes;
 
     /**
      * Request body parameters ($_POST).
      *
-     * @var \Symfony\Component\HttpFoundation\ParameterBag
+     * @var ParameterBag
      */
     public $request;
 
     /**
      * Query string parameters ($_GET).
      *
-     * @var \Symfony\Component\HttpFoundation\ParameterBag
+     * @var ParameterBag
      */
     public $query;
 
     /**
      * Server and execution environment parameters ($_SERVER).
      *
-     * @var \Symfony\Component\HttpFoundation\ServerBag
+     * @var ServerBag
      */
     public $server;
 
     /**
      * Uploaded files ($_FILES).
      *
-     * @var \Symfony\Component\HttpFoundation\FileBag
+     * @var FileBag
      */
     public $files;
 
     /**
      * Cookies ($_COOKIE).
      *
-     * @var \Symfony\Component\HttpFoundation\ParameterBag
+     * @var ParameterBag
      */
     public $cookies;
 
     /**
      * Headers (taken from the $_SERVER).
      *
-     * @var \Symfony\Component\HttpFoundation\HeaderBag
+     * @var HeaderBag
      */
     public $headers;
 
@@ -199,7 +171,7 @@ class Request
     protected $format;
 
     /**
-     * @var \Symfony\Component\HttpFoundation\Session\SessionInterface
+     * @var SessionInterface
      */
     protected $session;
 
@@ -225,15 +197,6 @@ class Request
 
     private static $trustedHeaderSet = -1;
 
-    /** @deprecated since version 3.3, to be removed in 4.0 */
-    private static $trustedHeaderNames = [
-        self::HEADER_FORWARDED => 'FORWARDED',
-        self::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',
-        self::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST',
-        self::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
-        self::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT',
-    ];
-
     private static $forwardedParams = [
         self::HEADER_X_FORWARDED_FOR => 'for',
         self::HEADER_X_FORWARDED_HOST => 'host',
@@ -242,6 +205,23 @@ class Request
     ];
 
     /**
+     * Names for headers that can be trusted when
+     * using trusted proxies.
+     *
+     * The FORWARDED header is the standard as of rfc7239.
+     *
+     * The other headers are non-standard, but widely used
+     * by popular reverse proxies (like Apache mod_proxy or Amazon EC2).
+     */
+    private static $trustedHeaders = [
+        self::HEADER_FORWARDED => 'FORWARDED',
+        self::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
+        self::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
+        self::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
+        self::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
+    ];
+
+    /**
      * @param array                $query      The GET parameters
      * @param array                $request    The POST parameters
      * @param array                $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
@@ -298,20 +278,7 @@ class Request
      */
     public static function createFromGlobals()
     {
-        // With the php's bug #66606, the php's built-in web server
-        // stores the Content-Type and Content-Length header values in
-        // HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH fields.
-        $server = $_SERVER;
-        if ('cli-server' === \PHP_SAPI) {
-            if (\array_key_exists('HTTP_CONTENT_LENGTH', $_SERVER)) {
-                $server['CONTENT_LENGTH'] = $_SERVER['HTTP_CONTENT_LENGTH'];
-            }
-            if (\array_key_exists('HTTP_CONTENT_TYPE', $_SERVER)) {
-                $server['CONTENT_TYPE'] = $_SERVER['HTTP_CONTENT_TYPE'];
-            }
-        }
-
-        $request = self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $server);
+        $request = self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER);
 
         if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
             && \in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), ['PUT', 'DELETE', 'PATCH'])
@@ -345,7 +312,7 @@ class Request
             'SERVER_NAME' => 'localhost',
             'SERVER_PORT' => 80,
             'HTTP_HOST' => 'localhost',
-            'HTTP_USER_AGENT' => 'Symfony/3.X',
+            'HTTP_USER_AGENT' => 'Symfony',
             'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
             'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5',
             'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
@@ -528,6 +495,10 @@ class Request
         try {
             $content = $this->getContent();
         } catch (\LogicException $e) {
+            if (\PHP_VERSION_ID >= 70400) {
+                throw $e;
+            }
+
             return trigger_error($e, E_USER_ERROR);
         }
 
@@ -578,10 +549,13 @@ class Request
         $requestOrder = ini_get('request_order') ?: ini_get('variables_order');
         $requestOrder = preg_replace('#[^cgp]#', '', strtolower($requestOrder)) ?: 'gp';
 
-        $_REQUEST = [];
+        $_REQUEST = [[]];
+
         foreach (str_split($requestOrder) as $order) {
-            $_REQUEST = array_merge($_REQUEST, $request[$order]);
+            $_REQUEST[] = $request[$order];
         }
+
+        $_REQUEST = array_merge(...$_REQUEST);
     }
 
     /**
@@ -594,20 +568,9 @@ class Request
      *
      * @throws \InvalidArgumentException When $trustedHeaderSet is invalid
      */
-    public static function setTrustedProxies(array $proxies/*, int $trustedHeaderSet*/)
+    public static function setTrustedProxies(array $proxies, int $trustedHeaderSet)
     {
         self::$trustedProxies = $proxies;
-
-        if (2 > \func_num_args()) {
-            @trigger_error(sprintf('The %s() method expects a bit field of Request::HEADER_* as second argument since Symfony 3.3. Defining it will be required in 4.0. ', __METHOD__), E_USER_DEPRECATED);
-
-            return;
-        }
-        $trustedHeaderSet = (int) func_get_arg(1);
-
-        foreach (self::$trustedHeaderNames as $header => $name) {
-            self::$trustedHeaders[$header] = $header & $trustedHeaderSet ? $name : null;
-        }
         self::$trustedHeaderSet = $trustedHeaderSet;
     }
 
@@ -658,78 +621,6 @@ class Request
     }
 
     /**
-     * Sets the name for trusted headers.
-     *
-     * The following header keys are supported:
-     *
-     *  * Request::HEADER_CLIENT_IP:    defaults to X-Forwarded-For   (see getClientIp())
-     *  * Request::HEADER_CLIENT_HOST:  defaults to X-Forwarded-Host  (see getHost())
-     *  * Request::HEADER_CLIENT_PORT:  defaults to X-Forwarded-Port  (see getPort())
-     *  * Request::HEADER_CLIENT_PROTO: defaults to X-Forwarded-Proto (see getScheme() and isSecure())
-     *  * Request::HEADER_FORWARDED:    defaults to Forwarded         (see RFC 7239)
-     *
-     * Setting an empty value allows to disable the trusted header for the given key.
-     *
-     * @param string $key   The header key
-     * @param string $value The header name
-     *
-     * @throws \InvalidArgumentException
-     *
-     * @deprecated since version 3.3, to be removed in 4.0. Use the $trustedHeaderSet argument of the Request::setTrustedProxies() method instead.
-     */
-    public static function setTrustedHeaderName($key, $value)
-    {
-        @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the $trustedHeaderSet argument of the Request::setTrustedProxies() method instead.', __METHOD__), E_USER_DEPRECATED);
-
-        if ('forwarded' === $key) {
-            $key = self::HEADER_FORWARDED;
-        } elseif ('client_ip' === $key) {
-            $key = self::HEADER_CLIENT_IP;
-        } elseif ('client_host' === $key) {
-            $key = self::HEADER_CLIENT_HOST;
-        } elseif ('client_proto' === $key) {
-            $key = self::HEADER_CLIENT_PROTO;
-        } elseif ('client_port' === $key) {
-            $key = self::HEADER_CLIENT_PORT;
-        } elseif (!\array_key_exists($key, self::$trustedHeaders)) {
-            throw new \InvalidArgumentException(sprintf('Unable to set the trusted header name for key "%s".', $key));
-        }
-
-        self::$trustedHeaders[$key] = $value;
-
-        if (null !== $value) {
-            self::$trustedHeaderNames[$key] = $value;
-            self::$trustedHeaderSet |= $key;
-        } else {
-            self::$trustedHeaderSet &= ~$key;
-        }
-    }
-
-    /**
-     * Gets the trusted proxy header name.
-     *
-     * @param string $key The header key
-     *
-     * @return string The header name
-     *
-     * @throws \InvalidArgumentException
-     *
-     * @deprecated since version 3.3, to be removed in 4.0. Use the Request::getTrustedHeaderSet() method instead.
-     */
-    public static function getTrustedHeaderName($key)
-    {
-        if (2 > \func_num_args() || func_get_arg(1)) {
-            @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the Request::getTrustedHeaderSet() method instead.', __METHOD__), E_USER_DEPRECATED);
-        }
-
-        if (!\array_key_exists($key, self::$trustedHeaders)) {
-            throw new \InvalidArgumentException(sprintf('Unable to get the trusted header name for key "%s".', $key));
-        }
-
-        return self::$trustedHeaders[$key];
-    }
-
-    /**
      * Normalizes a query string.
      *
      * It builds a normalized query string, where keys/value pairs are alphabetized,
@@ -745,31 +636,10 @@ class Request
             return '';
         }
 
-        $parts = [];
-        $order = [];
-
-        foreach (explode('&', $qs) as $param) {
-            if ('' === $param || '=' === $param[0]) {
-                // Ignore useless delimiters, e.g. "x=y&".
-                // Also ignore pairs with empty key, even if there was a value, e.g. "=value", as such nameless values cannot be retrieved anyway.
-                // PHP also does not include them when building _GET.
-                continue;
-            }
-
-            $keyValuePair = explode('=', $param, 2);
+        parse_str($qs, $qs);
+        ksort($qs);
 
-            // GET parameters, that are submitted from a HTML form, encode spaces as "+" by default (as defined in enctype application/x-www-form-urlencoded).
-            // PHP also converts "+" to spaces when filling the global _GET or when using the function parse_str. This is why we use urldecode and then normalize to
-            // RFC 3986 with rawurlencode.
-            $parts[] = isset($keyValuePair[1]) ?
-                rawurlencode(urldecode($keyValuePair[0])).'='.rawurlencode(urldecode($keyValuePair[1])) :
-                rawurlencode(urldecode($keyValuePair[0]));
-            $order[] = urldecode($keyValuePair[0]);
-        }
-
-        array_multisort($order, SORT_ASC, $parts);
-
-        return implode('&', $parts);
+        return http_build_query($qs, '', '&', PHP_QUERY_RFC3986);
     }
 
     /**
@@ -836,7 +706,17 @@ class Request
      */
     public function getSession()
     {
-        return $this->session;
+        $session = $this->session;
+        if (!$session instanceof SessionInterface && null !== $session) {
+            $this->setSession($session = $session());
+        }
+
+        if (null === $session) {
+            @trigger_error(sprintf('Calling "%s()" when no session has been set is deprecated since Symfony 4.1 and will throw an exception in 5.0. Use "hasSession()" instead.', __METHOD__), E_USER_DEPRECATED);
+            // throw new \BadMethodCallException('Session has not been set');
+        }
+
+        return $session;
     }
 
     /**
@@ -848,7 +728,7 @@ class Request
     public function hasPreviousSession()
     {
         // the check for $this->session avoids malicious users trying to fake a session cookie with proper name
-        return $this->hasSession() && $this->cookies->has($this->session->getName());
+        return $this->hasSession() && $this->cookies->has($this->getSession()->getName());
     }
 
     /**
@@ -876,6 +756,14 @@ class Request
     }
 
     /**
+     * @internal
+     */
+    public function setSessionFactory(callable $factory)
+    {
+        $this->session = $factory;
+    }
+
+    /**
      * Returns the client IP addresses.
      *
      * In the returned array the most trusted IP address is first, and the
@@ -896,7 +784,7 @@ class Request
             return [$ip];
         }
 
-        return $this->getTrustedValues(self::HEADER_CLIENT_IP, $ip) ?: [$ip];
+        return $this->getTrustedValues(self::HEADER_X_FORWARDED_FOR, $ip) ?: [$ip];
     }
 
     /**
@@ -915,7 +803,7 @@ class Request
      * @return string|null The client IP address
      *
      * @see getClientIps()
-     * @see http://en.wikipedia.org/wiki/X-Forwarded-For
+     * @see https://wikipedia.org/wiki/X-Forwarded-For
      */
     public function getClientIp()
     {
@@ -1015,17 +903,13 @@ class Request
      *
      * The "X-Forwarded-Port" header must contain the client port.
      *
-     * If your reverse proxy uses a different header name than "X-Forwarded-Port",
-     * configure it via via the $trustedHeaderSet argument of the
-     * Request::setTrustedProxies() method instead.
-     *
      * @return int|string can be a string if fetched from the server bag
      */
     public function getPort()
     {
-        if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_CLIENT_PORT)) {
+        if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_PORT)) {
             $host = $host[0];
-        } elseif ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_CLIENT_HOST)) {
+        } elseif ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_HOST)) {
             $host = $host[0];
         } elseif (!$host = $this->headers->get('HOST')) {
             return $this->server->get('SERVER_PORT');
@@ -1037,8 +921,8 @@ class Request
             $pos = strrpos($host, ':');
         }
 
-        if (false !== $pos) {
-            return (int) substr($host, $pos + 1);
+        if (false !== $pos && $port = substr($host, $pos + 1)) {
+            return (int) $port;
         }
 
         return 'https' === $this->getScheme() ? 443 : 80;
@@ -1204,7 +1088,7 @@ class Request
         // A reference to the same base directory or an empty subdirectory must be prefixed with "./".
         // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used
         // as the first segment of a relative-path reference, as it would be mistaken for a scheme name
-        // (see http://tools.ietf.org/html/rfc3986#section-4.2).
+        // (see https://tools.ietf.org/html/rfc3986#section-4.2).
         return !isset($path[0]) || '/' === $path[0]
             || false !== ($colonPos = strpos($path, ':')) && ($colonPos < ($slashPos = strpos($path, '/')) || false === $slashPos)
             ? "./$path" : $path;
@@ -1233,15 +1117,11 @@ class Request
      *
      * The "X-Forwarded-Proto" header must contain the protocol: "https" or "http".
      *
-     * If your reverse proxy uses a different header name than "X-Forwarded-Proto"
-     * ("SSL_HTTPS" for instance), configure it via the $trustedHeaderSet
-     * argument of the Request::setTrustedProxies() method instead.
-     *
      * @return bool
      */
     public function isSecure()
     {
-        if ($this->isFromTrustedProxy() && $proto = $this->getTrustedValues(self::HEADER_CLIENT_PROTO)) {
+        if ($this->isFromTrustedProxy() && $proto = $this->getTrustedValues(self::HEADER_X_FORWARDED_PROTO)) {
             return \in_array(strtolower($proto[0]), ['https', 'on', 'ssl', '1'], true);
         }
 
@@ -1258,17 +1138,13 @@ class Request
      *
      * The "X-Forwarded-Host" header must contain the client host name.
      *
-     * If your reverse proxy uses a different header name than "X-Forwarded-Host",
-     * configure it via the $trustedHeaderSet argument of the
-     * Request::setTrustedProxies() method instead.
-     *
      * @return string
      *
      * @throws SuspiciousOperationException when the host name is invalid or not trusted
      */
     public function getHost()
     {
-        if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_CLIENT_HOST)) {
+        if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_HOST)) {
             $host = $host[0];
         } elseif (!$host = $this->headers->get('HOST')) {
             if (!$host = $this->server->get('SERVER_NAME')) {
@@ -1449,6 +1325,8 @@ class Request
                 return $format;
             }
         }
+
+        return null;
     }
 
     /**
@@ -1569,18 +1447,12 @@ class Request
      *
      * @see https://tools.ietf.org/html/rfc7231#section-4.2.1
      *
-     * @param bool $andCacheable Adds the additional condition that the method should be cacheable. True by default.
-     *
      * @return bool
      */
-    public function isMethodSafe(/* $andCacheable = true */)
+    public function isMethodSafe()
     {
-        if (!\func_num_args() || func_get_arg(0)) {
-            // This deprecation should be turned into a BadMethodCallException in 4.0 (without adding the argument in the signature)
-            // then setting $andCacheable to false should be deprecated in 4.1
-            @trigger_error('Checking only for cacheable HTTP methods with Symfony\Component\HttpFoundation\Request::isMethodSafe() is deprecated since Symfony 3.2 and will throw an exception in 4.0. Disable checking only for cacheable methods by calling the method with `false` as first argument or use the Request::isMethodCacheable() instead.', E_USER_DEPRECATED);
-
-            return \in_array($this->getMethod(), ['GET', 'HEAD']);
+        if (\func_num_args() > 0 && func_get_arg(0)) {
+            throw new \BadMethodCallException('Checking only for cacheable HTTP methods with Symfony\Component\HttpFoundation\Request::isMethodSafe() is not supported.');
         }
 
         return \in_array($this->getMethod(), ['GET', 'HEAD', 'OPTIONS', 'TRACE']);
@@ -1644,9 +1516,6 @@ class Request
     public function getContent($asResource = false)
     {
         $currentContentIsResource = \is_resource($this->content);
-        if (\PHP_VERSION_ID < 50600 && false === $this->content) {
-            throw new \LogicException('getContent() can only be called once when using the resource return type and PHP below 5.6.');
-        }
 
         if (true === $asResource) {
             if ($currentContentIsResource) {
@@ -1823,7 +1692,7 @@ class Request
      * It works if your JavaScript library sets an X-Requested-With HTTP header.
      * It is known to work with common JavaScript frameworks:
      *
-     * @see http://en.wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript
+     * @see https://wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript
      *
      * @return bool true if the request is an XMLHttpRequest, false otherwise
      */
@@ -1835,9 +1704,9 @@ class Request
     /*
      * The following methods are derived from code of the Zend Framework (1.10dev - 2010-01-24)
      *
-     * Code subject to the new BSD license (http://framework.zend.com/license/new-bsd).
+     * Code subject to the new BSD license (https://framework.zend.com/license).
      *
-     * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+     * Copyright (c) 2005-2010 Zend Technologies USA Inc. (https://www.zend.com/)
      */
 
     protected function prepareRequestUri()
@@ -2032,12 +1901,7 @@ class Request
         ];
     }
 
-    /**
-     * Sets the default PHP locale.
-     *
-     * @param string $locale
-     */
-    private function setPhpDefaultLocale($locale)
+    private function setPhpDefaultLocale(string $locale)
     {
         // if either the class Locale doesn't exist, or an exception is thrown when
         // setting the default locale, the intl module is not installed, and
@@ -2054,12 +1918,9 @@ class Request
      * Returns the prefix as encoded in the string when the string starts with
      * the given prefix, false otherwise.
      *
-     * @param string $string The urlencoded string
-     * @param string $prefix The prefix not encoded
-     *
      * @return string|false The prefix as it is encoded in $string, or false
      */
-    private function getUrlencodedPrefix($string, $prefix)
+    private function getUrlencodedPrefix(string $string, string $prefix)
     {
         if (0 !== strpos(rawurldecode($string), $prefix)) {
             return false;
@@ -2077,7 +1938,7 @@ class Request
     private static function createRequestFromFactory(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null)
     {
         if (self::$requestFactory) {
-            $request = \call_user_func(self::$requestFactory, $query, $request, $attributes, $cookies, $files, $server, $content);
+            $request = (self::$requestFactory)($query, $request, $attributes, $cookies, $files, $server, $content);
 
             if (!$request instanceof self) {
                 throw new \LogicException('The Request factory must return an instance of Symfony\Component\HttpFoundation\Request.');
@@ -2107,22 +1968,28 @@ class Request
         $clientValues = [];
         $forwardedValues = [];
 
-        if (self::$trustedHeaders[$type] && $this->headers->has(self::$trustedHeaders[$type])) {
+        if ((self::$trustedHeaderSet & $type) && $this->headers->has(self::$trustedHeaders[$type])) {
             foreach (explode(',', $this->headers->get(self::$trustedHeaders[$type])) as $v) {
-                $clientValues[] = (self::HEADER_CLIENT_PORT === $type ? '0.0.0.0:' : '').trim($v);
+                $clientValues[] = (self::HEADER_X_FORWARDED_PORT === $type ? '0.0.0.0:' : '').trim($v);
             }
         }
 
-        if (self::$trustedHeaders[self::HEADER_FORWARDED] && $this->headers->has(self::$trustedHeaders[self::HEADER_FORWARDED])) {
-            $forwardedValues = $this->headers->get(self::$trustedHeaders[self::HEADER_FORWARDED]);
-            $forwardedValues = preg_match_all(sprintf('{(?:%s)="?([a-zA-Z0-9\.:_\-/\[\]]*+)}', self::$forwardedParams[$type]), $forwardedValues, $matches) ? $matches[1] : [];
-            if (self::HEADER_CLIENT_PORT === $type) {
-                foreach ($forwardedValues as $k => $v) {
+        if ((self::$trustedHeaderSet & self::HEADER_FORWARDED) && $this->headers->has(self::$trustedHeaders[self::HEADER_FORWARDED])) {
+            $forwarded = $this->headers->get(self::$trustedHeaders[self::HEADER_FORWARDED]);
+            $parts = HeaderUtils::split($forwarded, ',;=');
+            $forwardedValues = [];
+            $param = self::$forwardedParams[$type];
+            foreach ($parts as $subParts) {
+                if (null === $v = HeaderUtils::combine($subParts)[$param] ?? null) {
+                    continue;
+                }
+                if (self::HEADER_X_FORWARDED_PORT === $type) {
                     if (']' === substr($v, -1) || false === $v = strrchr($v, ':')) {
                         $v = $this->isSecure() ? ':443' : ':80';
                     }
-                    $forwardedValues[$k] = '0.0.0.0'.$v;
+                    $v = '0.0.0.0'.$v;
                 }
+                $forwardedValues[] = $v;
             }
         }
 
diff --git a/vendor/symfony/http-foundation/RequestMatcher.php b/vendor/symfony/http-foundation/RequestMatcher.php
index cadf70c..9a4a2a1 100644
--- a/vendor/symfony/http-foundation/RequestMatcher.php
+++ b/vendor/symfony/http-foundation/RequestMatcher.php
@@ -29,6 +29,11 @@ class RequestMatcher implements RequestMatcherInterface
     private $host;
 
     /**
+     * @var int|null
+     */
+    private $port;
+
+    /**
      * @var string[]
      */
     private $methods = [];
@@ -49,20 +54,18 @@ class RequestMatcher implements RequestMatcherInterface
     private $schemes = [];
 
     /**
-     * @param string|null          $path
-     * @param string|null          $host
      * @param string|string[]|null $methods
      * @param string|string[]|null $ips
-     * @param array                $attributes
      * @param string|string[]|null $schemes
      */
-    public function __construct($path = null, $host = null, $methods = null, $ips = null, array $attributes = [], $schemes = null)
+    public function __construct(string $path = null, string $host = null, $methods = null, $ips = null, array $attributes = [], $schemes = null, int $port = null)
     {
         $this->matchPath($path);
         $this->matchHost($host);
         $this->matchMethod($methods);
         $this->matchIps($ips);
         $this->matchScheme($schemes);
+        $this->matchPort($port);
 
         foreach ($attributes as $k => $v) {
             $this->matchAttribute($k, $v);
@@ -90,6 +93,16 @@ class RequestMatcher implements RequestMatcherInterface
     }
 
     /**
+     * Adds a check for the the URL port.
+     *
+     * @param int|null $port The port number to connect to
+     */
+    public function matchPort(?int $port)
+    {
+        $this->port = $port;
+    }
+
+    /**
      * Adds a check for the URL path info.
      *
      * @param string|null $regexp A Regexp
@@ -167,6 +180,10 @@ class RequestMatcher implements RequestMatcherInterface
             return false;
         }
 
+        if (null !== $this->port && 0 < $this->port && $request->getPort() !== $this->port) {
+            return false;
+        }
+
         if (IpUtils::checkIp($request->getClientIp(), $this->ips)) {
             return true;
         }
diff --git a/vendor/symfony/http-foundation/RequestStack.php b/vendor/symfony/http-foundation/RequestStack.php
index 885d78a..244a77d 100644
--- a/vendor/symfony/http-foundation/RequestStack.php
+++ b/vendor/symfony/http-foundation/RequestStack.php
@@ -47,7 +47,7 @@ class RequestStack
     public function pop()
     {
         if (!$this->requests) {
-            return;
+            return null;
         }
 
         return array_pop($this->requests);
@@ -73,7 +73,7 @@ class RequestStack
     public function getMasterRequest()
     {
         if (!$this->requests) {
-            return;
+            return null;
         }
 
         return $this->requests[0];
@@ -95,7 +95,7 @@ class RequestStack
         $pos = \count($this->requests) - 2;
 
         if (!isset($this->requests[$pos])) {
-            return;
+            return null;
         }
 
         return $this->requests[$pos];
diff --git a/vendor/symfony/http-foundation/Response.php b/vendor/symfony/http-foundation/Response.php
index 4ab0506..1e61645 100644
--- a/vendor/symfony/http-foundation/Response.php
+++ b/vendor/symfony/http-foundation/Response.php
@@ -88,7 +88,7 @@ class Response
     const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511;                             // RFC6585
 
     /**
-     * @var \Symfony\Component\HttpFoundation\ResponseHeaderBag
+     * @var ResponseHeaderBag
      */
     public $headers;
 
@@ -121,7 +121,7 @@ class Response
      * Status codes translation table.
      *
      * The list of codes is complete according to the
-     * {@link http://www.iana.org/assignments/http-status-codes/ Hypertext Transfer Protocol (HTTP) Status Code Registry}
+     * {@link https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml Hypertext Transfer Protocol (HTTP) Status Code Registry}
      * (last updated 2016-03-01).
      *
      * Unless otherwise noted, the status code is defined in RFC2616.
@@ -194,13 +194,9 @@ class Response
     ];
 
     /**
-     * @param mixed $content The response content, see setContent()
-     * @param int   $status  The response status code
-     * @param array $headers An array of response headers
-     *
      * @throws \InvalidArgumentException When the HTTP status code is not valid
      */
-    public function __construct($content = '', $status = 200, $headers = [])
+    public function __construct($content = '', int $status = 200, array $headers = [])
     {
         $this->headers = new ResponseHeaderBag($headers);
         $this->setContent($content);
@@ -317,6 +313,12 @@ class Response
 
         $this->ensureIEOverSSLCompatibility($request);
 
+        if ($request->isSecure()) {
+            foreach ($headers->getCookies() as $cookie) {
+                $cookie->setSecureDefault(true);
+            }
+        }
+
         return $this;
     }
 
@@ -342,7 +344,7 @@ class Response
 
         // cookies
         foreach ($this->headers->getCookies() as $cookie) {
-            header('Set-Cookie: '.$cookie->getName().strstr($cookie, '='), false, $this->statusCode);
+            header('Set-Cookie: '.$cookie, false, $this->statusCode);
         }
 
         // status
@@ -407,7 +409,7 @@ class Response
     /**
      * Gets the current response content.
      *
-     * @return string Content
+     * @return string|false
      */
     public function getContent()
     {
@@ -417,13 +419,11 @@ class Response
     /**
      * Sets the HTTP protocol version (1.0 or 1.1).
      *
-     * @param string $version The HTTP protocol version
-     *
      * @return $this
      *
-     * @final since version 3.2
+     * @final
      */
-    public function setProtocolVersion($version)
+    public function setProtocolVersion(string $version)
     {
         $this->version = $version;
 
@@ -433,11 +433,9 @@ class Response
     /**
      * Gets the HTTP protocol version.
      *
-     * @return string The HTTP protocol version
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function getProtocolVersion()
+    public function getProtocolVersion(): string
     {
         return $this->version;
     }
@@ -448,18 +446,15 @@ class Response
      * If the status text is null it will be automatically populated for the known
      * status codes and left empty otherwise.
      *
-     * @param int   $code HTTP status code
-     * @param mixed $text HTTP status text
-     *
      * @return $this
      *
      * @throws \InvalidArgumentException When the HTTP status code is not valid
      *
-     * @final since version 3.2
+     * @final
      */
-    public function setStatusCode($code, $text = null)
+    public function setStatusCode(int $code, $text = null)
     {
-        $this->statusCode = $code = (int) $code;
+        $this->statusCode = $code;
         if ($this->isInvalid()) {
             throw new \InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $code));
         }
@@ -484,11 +479,9 @@ class Response
     /**
      * Retrieves the status code for the current web response.
      *
-     * @return int Status code
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function getStatusCode()
+    public function getStatusCode(): int
     {
         return $this->statusCode;
     }
@@ -496,13 +489,11 @@ class Response
     /**
      * Sets the response charset.
      *
-     * @param string $charset Character set
-     *
      * @return $this
      *
-     * @final since version 3.2
+     * @final
      */
-    public function setCharset($charset)
+    public function setCharset(string $charset)
     {
         $this->charset = $charset;
 
@@ -512,11 +503,9 @@ class Response
     /**
      * Retrieves the response charset.
      *
-     * @return string Character set
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function getCharset()
+    public function getCharset(): ?string
     {
         return $this->charset;
     }
@@ -536,11 +525,9 @@ class Response
      * can be reused by a cache with heuristic expiration unless otherwise indicated"
      * (https://tools.ietf.org/html/rfc7231#section-6.1)
      *
-     * @return bool true if the response is worth caching, false otherwise
-     *
-     * @final since version 3.3
+     * @final
      */
-    public function isCacheable()
+    public function isCacheable(): bool
     {
         if (!\in_array($this->statusCode, [200, 203, 300, 301, 302, 404, 410])) {
             return false;
@@ -560,11 +547,9 @@ class Response
      * origin. A response is considered fresh when it includes a Cache-Control/max-age
      * indicator or Expires header and the calculated age is less than the freshness lifetime.
      *
-     * @return bool true if the response is fresh, false otherwise
-     *
-     * @final since version 3.3
+     * @final
      */
-    public function isFresh()
+    public function isFresh(): bool
     {
         return $this->getTtl() > 0;
     }
@@ -573,11 +558,9 @@ class Response
      * Returns true if the response includes headers that can be used to validate
      * the response with the origin server using a conditional GET request.
      *
-     * @return bool true if the response is validateable, false otherwise
-     *
-     * @final since version 3.3
+     * @final
      */
-    public function isValidateable()
+    public function isValidateable(): bool
     {
         return $this->headers->has('Last-Modified') || $this->headers->has('ETag');
     }
@@ -589,7 +572,7 @@ class Response
      *
      * @return $this
      *
-     * @final since version 3.2
+     * @final
      */
     public function setPrivate()
     {
@@ -606,7 +589,7 @@ class Response
      *
      * @return $this
      *
-     * @final since version 3.2
+     * @final
      */
     public function setPublic()
     {
@@ -619,13 +602,11 @@ class Response
     /**
      * Marks the response as "immutable".
      *
-     * @param bool $immutable enables or disables the immutable directive
-     *
      * @return $this
      *
      * @final
      */
-    public function setImmutable($immutable = true)
+    public function setImmutable(bool $immutable = true)
     {
         if ($immutable) {
             $this->headers->addCacheControlDirective('immutable');
@@ -639,11 +620,9 @@ class Response
     /**
      * Returns true if the response is marked as "immutable".
      *
-     * @return bool returns true if the response is marked as "immutable"; otherwise false
-     *
      * @final
      */
-    public function isImmutable()
+    public function isImmutable(): bool
     {
         return $this->headers->hasCacheControlDirective('immutable');
     }
@@ -656,11 +635,9 @@ class Response
      * When present, the TTL of the response should not be overridden to be
      * greater than the value provided by the origin.
      *
-     * @return bool true if the response must be revalidated by a cache, false otherwise
-     *
-     * @final since version 3.3
+     * @final
      */
-    public function mustRevalidate()
+    public function mustRevalidate(): bool
     {
         return $this->headers->hasCacheControlDirective('must-revalidate') || $this->headers->hasCacheControlDirective('proxy-revalidate');
     }
@@ -668,13 +645,11 @@ class Response
     /**
      * Returns the Date header as a DateTime instance.
      *
-     * @return \DateTime A \DateTime instance
-     *
      * @throws \RuntimeException When the header is not parseable
      *
-     * @final since version 3.2
+     * @final
      */
-    public function getDate()
+    public function getDate(): ?\DateTimeInterface
     {
         return $this->headers->getDate('Date');
     }
@@ -684,24 +659,26 @@ class Response
      *
      * @return $this
      *
-     * @final since version 3.2
+     * @final
      */
-    public function setDate(\DateTime $date)
+    public function setDate(\DateTimeInterface $date)
     {
-        $date->setTimezone(new \DateTimeZone('UTC'));
+        if ($date instanceof \DateTime) {
+            $date = \DateTimeImmutable::createFromMutable($date);
+        }
+
+        $date = $date->setTimezone(new \DateTimeZone('UTC'));
         $this->headers->set('Date', $date->format('D, d M Y H:i:s').' GMT');
 
         return $this;
     }
 
     /**
-     * Returns the age of the response.
-     *
-     * @return int The age of the response in seconds
+     * Returns the age of the response in seconds.
      *
-     * @final since version 3.2
+     * @final
      */
-    public function getAge()
+    public function getAge(): int
     {
         if (null !== $age = $this->headers->get('Age')) {
             return (int) $age;
@@ -728,17 +705,15 @@ class Response
     /**
      * Returns the value of the Expires header as a DateTime instance.
      *
-     * @return \DateTime|null A DateTime instance or null if the header does not exist
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function getExpires()
+    public function getExpires(): ?\DateTimeInterface
     {
         try {
             return $this->headers->getDate('Expires');
         } catch (\RuntimeException $e) {
             // according to RFC 2616 invalid date formats (e.g. "0" and "-1") must be treated as in the past
-            return \DateTime::createFromFormat(DATE_RFC2822, 'Sat, 01 Jan 00 00:00:00 +0000');
+            return \DateTime::createFromFormat('U', time() - 172800);
         }
     }
 
@@ -747,22 +722,25 @@ class Response
      *
      * Passing null as value will remove the header.
      *
-     * @param \DateTime|null $date A \DateTime instance or null to remove the header
-     *
      * @return $this
      *
-     * @final since version 3.2
+     * @final
      */
-    public function setExpires(\DateTime $date = null)
+    public function setExpires(\DateTimeInterface $date = null)
     {
         if (null === $date) {
             $this->headers->remove('Expires');
-        } else {
-            $date = clone $date;
-            $date->setTimezone(new \DateTimeZone('UTC'));
-            $this->headers->set('Expires', $date->format('D, d M Y H:i:s').' GMT');
+
+            return $this;
         }
 
+        if ($date instanceof \DateTime) {
+            $date = \DateTimeImmutable::createFromMutable($date);
+        }
+
+        $date = $date->setTimezone(new \DateTimeZone('UTC'));
+        $this->headers->set('Expires', $date->format('D, d M Y H:i:s').' GMT');
+
         return $this;
     }
 
@@ -773,11 +751,9 @@ class Response
      * First, it checks for a s-maxage directive, then a max-age directive, and then it falls
      * back on an expires header. It returns null when no maximum age can be established.
      *
-     * @return int|null Number of seconds
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function getMaxAge()
+    public function getMaxAge(): ?int
     {
         if ($this->headers->hasCacheControlDirective('s-maxage')) {
             return (int) $this->headers->getCacheControlDirective('s-maxage');
@@ -790,6 +766,8 @@ class Response
         if (null !== $this->getExpires()) {
             return (int) $this->getExpires()->format('U') - (int) $this->getDate()->format('U');
         }
+
+        return null;
     }
 
     /**
@@ -797,13 +775,11 @@ class Response
      *
      * This methods sets the Cache-Control max-age directive.
      *
-     * @param int $value Number of seconds
-     *
      * @return $this
      *
-     * @final since version 3.2
+     * @final
      */
-    public function setMaxAge($value)
+    public function setMaxAge(int $value)
     {
         $this->headers->addCacheControlDirective('max-age', $value);
 
@@ -815,13 +791,11 @@ class Response
      *
      * This methods sets the Cache-Control s-maxage directive.
      *
-     * @param int $value Number of seconds
-     *
      * @return $this
      *
-     * @final since version 3.2
+     * @final
      */
-    public function setSharedMaxAge($value)
+    public function setSharedMaxAge(int $value)
     {
         $this->setPublic();
         $this->headers->addCacheControlDirective('s-maxage', $value);
@@ -837,29 +811,25 @@ class Response
      * When the responses TTL is <= 0, the response may not be served from cache without first
      * revalidating with the origin.
      *
-     * @return int|null The TTL in seconds
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function getTtl()
+    public function getTtl(): ?int
     {
-        if (null !== $maxAge = $this->getMaxAge()) {
-            return $maxAge - $this->getAge();
-        }
+        $maxAge = $this->getMaxAge();
+
+        return null !== $maxAge ? $maxAge - $this->getAge() : null;
     }
 
     /**
-     * Sets the response's time-to-live for shared caches.
+     * Sets the response's time-to-live for shared caches in seconds.
      *
      * This method adjusts the Cache-Control/s-maxage directive.
      *
-     * @param int $seconds Number of seconds
-     *
      * @return $this
      *
-     * @final since version 3.2
+     * @final
      */
-    public function setTtl($seconds)
+    public function setTtl(int $seconds)
     {
         $this->setSharedMaxAge($this->getAge() + $seconds);
 
@@ -867,17 +837,15 @@ class Response
     }
 
     /**
-     * Sets the response's time-to-live for private/client caches.
+     * Sets the response's time-to-live for private/client caches in seconds.
      *
      * This method adjusts the Cache-Control/max-age directive.
      *
-     * @param int $seconds Number of seconds
-     *
      * @return $this
      *
-     * @final since version 3.2
+     * @final
      */
-    public function setClientTtl($seconds)
+    public function setClientTtl(int $seconds)
     {
         $this->setMaxAge($this->getAge() + $seconds);
 
@@ -887,13 +855,11 @@ class Response
     /**
      * Returns the Last-Modified HTTP header as a DateTime instance.
      *
-     * @return \DateTime|null A DateTime instance or null if the header does not exist
-     *
      * @throws \RuntimeException When the HTTP header is not parseable
      *
-     * @final since version 3.2
+     * @final
      */
-    public function getLastModified()
+    public function getLastModified(): ?\DateTimeInterface
     {
         return $this->headers->getDate('Last-Modified');
     }
@@ -903,33 +869,34 @@ class Response
      *
      * Passing null as value will remove the header.
      *
-     * @param \DateTime|null $date A \DateTime instance or null to remove the header
-     *
      * @return $this
      *
-     * @final since version 3.2
+     * @final
      */
-    public function setLastModified(\DateTime $date = null)
+    public function setLastModified(\DateTimeInterface $date = null)
     {
         if (null === $date) {
             $this->headers->remove('Last-Modified');
-        } else {
-            $date = clone $date;
-            $date->setTimezone(new \DateTimeZone('UTC'));
-            $this->headers->set('Last-Modified', $date->format('D, d M Y H:i:s').' GMT');
+
+            return $this;
         }
 
+        if ($date instanceof \DateTime) {
+            $date = \DateTimeImmutable::createFromMutable($date);
+        }
+
+        $date = $date->setTimezone(new \DateTimeZone('UTC'));
+        $this->headers->set('Last-Modified', $date->format('D, d M Y H:i:s').' GMT');
+
         return $this;
     }
 
     /**
      * Returns the literal value of the ETag HTTP header.
      *
-     * @return string|null The ETag HTTP header or null if it does not exist
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function getEtag()
+    public function getEtag(): ?string
     {
         return $this->headers->get('ETag');
     }
@@ -942,9 +909,9 @@ class Response
      *
      * @return $this
      *
-     * @final since version 3.2
+     * @final
      */
-    public function setEtag($etag = null, $weak = false)
+    public function setEtag(string $etag = null, bool $weak = false)
     {
         if (null === $etag) {
             $this->headers->remove('Etag');
@@ -964,13 +931,11 @@ class Response
      *
      * Available options are: etag, last_modified, max_age, s_maxage, private, public and immutable.
      *
-     * @param array $options An array of cache options
-     *
      * @return $this
      *
      * @throws \InvalidArgumentException
      *
-     * @final since version 3.3
+     * @final
      */
     public function setCache(array $options)
     {
@@ -1025,9 +990,9 @@ class Response
      *
      * @return $this
      *
-     * @see http://tools.ietf.org/html/rfc2616#section-10.3.5
+     * @see https://tools.ietf.org/html/rfc2616#section-10.3.5
      *
-     * @final since version 3.3
+     * @final
      */
     public function setNotModified()
     {
@@ -1045,11 +1010,9 @@ class Response
     /**
      * Returns true if the response includes a Vary header.
      *
-     * @return bool true if the response includes a Vary header, false otherwise
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function hasVary()
+    public function hasVary(): bool
     {
         return null !== $this->headers->get('Vary');
     }
@@ -1057,11 +1020,9 @@ class Response
     /**
      * Returns an array of header names given in the Vary header.
      *
-     * @return array An array of Vary names
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function getVary()
+    public function getVary(): array
     {
         if (!$vary = $this->headers->get('Vary', null, false)) {
             return [];
@@ -1083,9 +1044,9 @@ class Response
      *
      * @return $this
      *
-     * @final since version 3.2
+     * @final
      */
-    public function setVary($headers, $replace = true)
+    public function setVary($headers, bool $replace = true)
     {
         $this->headers->set('Vary', $headers, $replace);
 
@@ -1101,9 +1062,9 @@ class Response
      *
      * @return bool true if the Response validators match the Request, false otherwise
      *
-     * @final since version 3.3
+     * @final
      */
-    public function isNotModified(Request $request)
+    public function isNotModified(Request $request): bool
     {
         if (!$request->isMethodCacheable()) {
             return false;
@@ -1131,13 +1092,11 @@ class Response
     /**
      * Is response invalid?
      *
-     * @return bool
-     *
-     * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+     * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
      *
-     * @final since version 3.2
+     * @final
      */
-    public function isInvalid()
+    public function isInvalid(): bool
     {
         return $this->statusCode < 100 || $this->statusCode >= 600;
     }
@@ -1145,11 +1104,9 @@ class Response
     /**
      * Is response informative?
      *
-     * @return bool
-     *
-     * @final since version 3.3
+     * @final
      */
-    public function isInformational()
+    public function isInformational(): bool
     {
         return $this->statusCode >= 100 && $this->statusCode < 200;
     }
@@ -1157,11 +1114,9 @@ class Response
     /**
      * Is response successful?
      *
-     * @return bool
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function isSuccessful()
+    public function isSuccessful(): bool
     {
         return $this->statusCode >= 200 && $this->statusCode < 300;
     }
@@ -1169,11 +1124,9 @@ class Response
     /**
      * Is the response a redirect?
      *
-     * @return bool
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function isRedirection()
+    public function isRedirection(): bool
     {
         return $this->statusCode >= 300 && $this->statusCode < 400;
     }
@@ -1181,11 +1134,9 @@ class Response
     /**
      * Is there a client error?
      *
-     * @return bool
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function isClientError()
+    public function isClientError(): bool
     {
         return $this->statusCode >= 400 && $this->statusCode < 500;
     }
@@ -1193,11 +1144,9 @@ class Response
     /**
      * Was there a server side error?
      *
-     * @return bool
-     *
-     * @final since version 3.3
+     * @final
      */
-    public function isServerError()
+    public function isServerError(): bool
     {
         return $this->statusCode >= 500 && $this->statusCode < 600;
     }
@@ -1205,11 +1154,9 @@ class Response
     /**
      * Is the response OK?
      *
-     * @return bool
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function isOk()
+    public function isOk(): bool
     {
         return 200 === $this->statusCode;
     }
@@ -1217,11 +1164,9 @@ class Response
     /**
      * Is the response forbidden?
      *
-     * @return bool
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function isForbidden()
+    public function isForbidden(): bool
     {
         return 403 === $this->statusCode;
     }
@@ -1229,11 +1174,9 @@ class Response
     /**
      * Is the response a not found error?
      *
-     * @return bool
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function isNotFound()
+    public function isNotFound(): bool
     {
         return 404 === $this->statusCode;
     }
@@ -1241,13 +1184,9 @@ class Response
     /**
      * Is the response a redirect of some form?
      *
-     * @param string $location
-     *
-     * @return bool
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function isRedirect($location = null)
+    public function isRedirect(string $location = null): bool
     {
         return \in_array($this->statusCode, [201, 301, 302, 303, 307, 308]) && (null === $location ?: $location == $this->headers->get('Location'));
     }
@@ -1255,11 +1194,9 @@ class Response
     /**
      * Is the response empty?
      *
-     * @return bool
-     *
-     * @final since version 3.2
+     * @final
      */
-    public function isEmpty()
+    public function isEmpty(): bool
     {
         return \in_array($this->statusCode, [204, 304]);
     }
@@ -1269,17 +1206,13 @@ class Response
      *
      * Resulting level can be greater than target level if a non-removable buffer has been encountered.
      *
-     * @param int  $targetLevel The target output buffering level
-     * @param bool $flush       Whether to flush or clean the buffers
-     *
-     * @final since version 3.3
+     * @final
      */
-    public static function closeOutputBuffers($targetLevel, $flush)
+    public static function closeOutputBuffers(int $targetLevel, bool $flush)
     {
         $status = ob_get_status(true);
         $level = \count($status);
-        // PHP_OUTPUT_HANDLER_* are not defined on HHVM 3.3
-        $flags = \defined('PHP_OUTPUT_HANDLER_REMOVABLE') ? PHP_OUTPUT_HANDLER_REMOVABLE | ($flush ? PHP_OUTPUT_HANDLER_FLUSHABLE : PHP_OUTPUT_HANDLER_CLEANABLE) : -1;
+        $flags = PHP_OUTPUT_HANDLER_REMOVABLE | ($flush ? PHP_OUTPUT_HANDLER_FLUSHABLE : PHP_OUTPUT_HANDLER_CLEANABLE);
 
         while ($level-- > $targetLevel && ($s = $status[$level]) && (!isset($s['del']) ? !isset($s['flags']) || ($s['flags'] & $flags) === $flags : $s['del'])) {
             if ($flush) {
@@ -1295,7 +1228,7 @@ class Response
      *
      * @see http://support.microsoft.com/kb/323308
      *
-     * @final since version 3.3
+     * @final
      */
     protected function ensureIEOverSSLCompatibility(Request $request)
     {
diff --git a/vendor/symfony/http-foundation/ResponseHeaderBag.php b/vendor/symfony/http-foundation/ResponseHeaderBag.php
index 1dc8dc2..cf44d0e 100644
--- a/vendor/symfony/http-foundation/ResponseHeaderBag.php
+++ b/vendor/symfony/http-foundation/ResponseHeaderBag.php
@@ -122,8 +122,7 @@ class ResponseHeaderBag extends HeaderBag
         parent::set($key, $values, $replace);
 
         // ensure the cache-control header has sensible defaults
-        if (\in_array($uniqueKey, ['cache-control', 'etag', 'last-modified', 'expires'], true)) {
-            $computed = $this->computeCacheControlValue();
+        if (\in_array($uniqueKey, ['cache-control', 'etag', 'last-modified', 'expires'], true) && '' !== $computed = $this->computeCacheControlValue()) {
             $this->headers['cache-control'] = [$computed];
             $this->headerNames['cache-control'] = 'Cache-Control';
             $this->computedCacheControl = $this->parseCacheControl($computed);
@@ -247,56 +246,15 @@ class ResponseHeaderBag extends HeaderBag
      */
     public function clearCookie($name, $path = '/', $domain = null, $secure = false, $httpOnly = true)
     {
-        $this->setCookie(new Cookie($name, null, 1, $path, $domain, $secure, $httpOnly));
+        $this->setCookie(new Cookie($name, null, 1, $path, $domain, $secure, $httpOnly, false, null));
     }
 
     /**
-     * Generates a HTTP Content-Disposition field-value.
-     *
-     * @param string $disposition      One of "inline" or "attachment"
-     * @param string $filename         A unicode string
-     * @param string $filenameFallback A string containing only ASCII characters that
-     *                                 is semantically equivalent to $filename. If the filename is already ASCII,
-     *                                 it can be omitted, or just copied from $filename
-     *
-     * @return string A string suitable for use as a Content-Disposition field-value
-     *
-     * @throws \InvalidArgumentException
-     *
-     * @see RFC 6266
+     * @see HeaderUtils::makeDisposition()
      */
     public function makeDisposition($disposition, $filename, $filenameFallback = '')
     {
-        if (!\in_array($disposition, [self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE])) {
-            throw new \InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE));
-        }
-
-        if ('' == $filenameFallback) {
-            $filenameFallback = $filename;
-        }
-
-        // filenameFallback is not ASCII.
-        if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) {
-            throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.');
-        }
-
-        // percent characters aren't safe in fallback.
-        if (false !== strpos($filenameFallback, '%')) {
-            throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.');
-        }
-
-        // path separators aren't allowed in either.
-        if (false !== strpos($filename, '/') || false !== strpos($filename, '\\') || false !== strpos($filenameFallback, '/') || false !== strpos($filenameFallback, '\\')) {
-            throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.');
-        }
-
-        $output = sprintf('%s; filename="%s"', $disposition, str_replace('"', '\\"', $filenameFallback));
-
-        if ($filename !== $filenameFallback) {
-            $output .= sprintf("; filename*=utf-8''%s", rawurlencode($filename));
-        }
-
-        return $output;
+        return HeaderUtils::makeDisposition((string) $disposition, (string) $filename, (string) $filenameFallback);
     }
 
     /**
diff --git a/vendor/symfony/http-foundation/ServerBag.php b/vendor/symfony/http-foundation/ServerBag.php
index 90da49f..4c82b17 100644
--- a/vendor/symfony/http-foundation/ServerBag.php
+++ b/vendor/symfony/http-foundation/ServerBag.php
@@ -79,7 +79,7 @@ class ServerBag extends ParameterBag
                     /*
                      * XXX: Since there is no PHP_AUTH_BEARER in PHP predefined variables,
                      *      I'll just set $headers['AUTHORIZATION'] here.
-                     *      http://php.net/manual/en/reserved.variables.server.php
+                     *      https://php.net/reserved.variables.server
                      */
                     $headers['AUTHORIZATION'] = $authorizationHeader;
                 }
diff --git a/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php b/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php
index 07118e8..ee33698 100644
--- a/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php
+++ b/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php
@@ -24,7 +24,7 @@ class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Counta
     /**
      * @param string $storageKey The key used to store attributes in the session
      */
-    public function __construct($storageKey = '_sf2_attributes')
+    public function __construct(string $storageKey = '_sf2_attributes')
     {
         $this->storageKey = $storageKey;
     }
diff --git a/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php b/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php
index bbf2e39..2cf0743 100644
--- a/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php
+++ b/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php
@@ -25,7 +25,7 @@ class NamespacedAttributeBag extends AttributeBag
      * @param string $storageKey         Session storage key
      * @param string $namespaceCharacter Namespace character to use in keys
      */
-    public function __construct($storageKey = '_sf2_attributes', $namespaceCharacter = '/')
+    public function __construct(string $storageKey = '_sf2_attributes', string $namespaceCharacter = '/')
     {
         $this->namespaceCharacter = $namespaceCharacter;
         parent::__construct($storageKey);
@@ -97,7 +97,7 @@ class NamespacedAttributeBag extends AttributeBag
      * @param string $name         Key name
      * @param bool   $writeContext Write context, default false
      *
-     * @return array
+     * @return array|null
      */
     protected function &resolveAttributePath($name, $writeContext = false)
     {
diff --git a/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php b/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php
index 451c4a5..6502f3d 100644
--- a/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php
+++ b/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php
@@ -25,7 +25,7 @@ class AutoExpireFlashBag implements FlashBagInterface
     /**
      * @param string $storageKey The key used to store flashes in the session
      */
-    public function __construct($storageKey = '_symfony_flashes')
+    public function __construct(string $storageKey = '_symfony_flashes')
     {
         $this->storageKey = $storageKey;
     }
diff --git a/vendor/symfony/http-foundation/Session/Flash/FlashBag.php b/vendor/symfony/http-foundation/Session/Flash/FlashBag.php
index f5d984a..c6b7ce3 100644
--- a/vendor/symfony/http-foundation/Session/Flash/FlashBag.php
+++ b/vendor/symfony/http-foundation/Session/Flash/FlashBag.php
@@ -25,7 +25,7 @@ class FlashBag implements FlashBagInterface
     /**
      * @param string $storageKey The key used to store flashes in the session
      */
-    public function __construct($storageKey = '_symfony_flashes')
+    public function __construct(string $storageKey = '_symfony_flashes')
     {
         $this->storageKey = $storageKey;
     }
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php
index eb09c0b..78340ef 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php
@@ -11,6 +11,8 @@
 
 namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
 
+use Symfony\Component\HttpFoundation\Session\SessionUtils;
+
 /**
  * This abstract session handler provides a generic implementation
  * of the PHP 7.0 SessionUpdateTimestampHandlerInterface,
@@ -91,9 +93,6 @@ abstract class AbstractSessionHandler implements \SessionHandlerInterface, \Sess
 
         $data = $this->doRead($sessionId);
         $this->newSessionId = '' === $data ? $sessionId : null;
-        if (\PHP_VERSION_ID < 70000) {
-            $this->prefetchData = $data;
-        }
 
         return $data;
     }
@@ -103,14 +102,6 @@ abstract class AbstractSessionHandler implements \SessionHandlerInterface, \Sess
      */
     public function write($sessionId, $data)
     {
-        if (\PHP_VERSION_ID < 70000 && $this->prefetchData) {
-            $readData = $this->prefetchData;
-            $this->prefetchData = null;
-
-            if ($readData === $data) {
-                return $this->updateTimestamp($sessionId, $data);
-            }
-        }
         if (null === $this->igbinaryEmptyData) {
             // see https://github.com/igbinary/igbinary/issues/146
             $this->igbinaryEmptyData = \function_exists('igbinary_serialize') ? igbinary_serialize([]) : '';
@@ -128,38 +119,27 @@ abstract class AbstractSessionHandler implements \SessionHandlerInterface, \Sess
      */
     public function destroy($sessionId)
     {
-        if (\PHP_VERSION_ID < 70000) {
-            $this->prefetchData = null;
-        }
         if (!headers_sent() && filter_var(ini_get('session.use_cookies'), FILTER_VALIDATE_BOOLEAN)) {
             if (!$this->sessionName) {
                 throw new \LogicException(sprintf('Session name cannot be empty, did you forget to call "parent::open()" in "%s"?.', \get_class($this)));
             }
-            $sessionCookie = sprintf(' %s=', urlencode($this->sessionName));
-            $sessionCookieWithId = sprintf('%s%s;', $sessionCookie, urlencode($sessionId));
-            $sessionCookieFound = false;
-            $otherCookies = [];
-            foreach (headers_list() as $h) {
-                if (0 !== stripos($h, 'Set-Cookie:')) {
-                    continue;
-                }
-                if (11 === strpos($h, $sessionCookie, 11)) {
-                    $sessionCookieFound = true;
-
-                    if (11 !== strpos($h, $sessionCookieWithId, 11)) {
-                        $otherCookies[] = $h;
-                    }
+            $cookie = SessionUtils::popSessionCookie($this->sessionName, $sessionId);
+
+            /*
+             * We send an invalidation Set-Cookie header (zero lifetime)
+             * when either the session was started or a cookie with
+             * the session name was sent by the client (in which case
+             * we know it's invalid as a valid session cookie would've
+             * started the session).
+             */
+            if (null === $cookie || isset($_COOKIE[$this->sessionName])) {
+                if (\PHP_VERSION_ID < 70300) {
+                    setcookie($this->sessionName, '', 0, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), filter_var(ini_get('session.cookie_secure'), FILTER_VALIDATE_BOOLEAN), filter_var(ini_get('session.cookie_httponly'), FILTER_VALIDATE_BOOLEAN));
                 } else {
-                    $otherCookies[] = $h;
-                }
-            }
-            if ($sessionCookieFound) {
-                header_remove('Set-Cookie');
-                foreach ($otherCookies as $h) {
-                    header($h, false);
+                    $params = session_get_cookie_params();
+                    unset($params['lifetime']);
+                    setcookie($this->sessionName, '', $params);
                 }
-            } else {
-                setcookie($this->sessionName, '', 0, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), filter_var(ini_get('session.cookie_secure'), FILTER_VALIDATE_BOOLEAN), filter_var(ini_get('session.cookie_httponly'), FILTER_VALIDATE_BOOLEAN));
             }
         }
 
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/MemcacheSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/MemcacheSessionHandler.php
deleted file mode 100644
index 3abc33c..0000000
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/MemcacheSessionHandler.php
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
-
-@trigger_error(sprintf('The class %s is deprecated since Symfony 3.4 and will be removed in 4.0. Use Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandler instead.', MemcacheSessionHandler::class), E_USER_DEPRECATED);
-
-/**
- * @author Drak <drak@zikula.org>
- *
- * @deprecated since version 3.4, to be removed in 4.0. Use Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandler instead.
- */
-class MemcacheSessionHandler implements \SessionHandlerInterface
-{
-    private $memcache;
-
-    /**
-     * @var int Time to live in seconds
-     */
-    private $ttl;
-
-    /**
-     * @var string Key prefix for shared environments
-     */
-    private $prefix;
-
-    /**
-     * Constructor.
-     *
-     * List of available options:
-     *  * prefix: The prefix to use for the memcache keys in order to avoid collision
-     *  * expiretime: The time to live in seconds
-     *
-     * @param \Memcache $memcache A \Memcache instance
-     * @param array     $options  An associative array of Memcache options
-     *
-     * @throws \InvalidArgumentException When unsupported options are passed
-     */
-    public function __construct(\Memcache $memcache, array $options = [])
-    {
-        if ($diff = array_diff(array_keys($options), ['prefix', 'expiretime'])) {
-            throw new \InvalidArgumentException(sprintf('The following options are not supported "%s"', implode(', ', $diff)));
-        }
-
-        $this->memcache = $memcache;
-        $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400;
-        $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s';
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function open($savePath, $sessionName)
-    {
-        return true;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function close()
-    {
-        return true;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function read($sessionId)
-    {
-        return $this->memcache->get($this->prefix.$sessionId) ?: '';
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function write($sessionId, $data)
-    {
-        return $this->memcache->set($this->prefix.$sessionId, $data, 0, time() + $this->ttl);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function destroy($sessionId)
-    {
-        $this->memcache->delete($this->prefix.$sessionId);
-
-        return true;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function gc($maxlifetime)
-    {
-        // not required here because memcache will auto expire the records anyhow.
-        return true;
-    }
-
-    /**
-     * Return a Memcache instance.
-     *
-     * @return \Memcache
-     */
-    protected function getMemcache()
-    {
-        return $this->memcache;
-    }
-}
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php
index 1db590b..a399be5 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php
@@ -15,7 +15,7 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
  * Memcached based session storage handler based on the Memcached class
  * provided by the PHP memcached extension.
  *
- * @see http://php.net/memcached
+ * @see https://php.net/memcached
  *
  * @author Drak <drak@zikula.org>
  */
@@ -40,9 +40,6 @@ class MemcachedSessionHandler extends AbstractSessionHandler
      *  * prefix: The prefix to use for the memcached keys in order to avoid collision
      *  * expiretime: The time to live in seconds.
      *
-     * @param \Memcached $memcached A \Memcached instance
-     * @param array      $options   An associative array of Memcached options
-     *
      * @throws \InvalidArgumentException When unsupported options are passed
      */
     public function __construct(\Memcached $memcached, array $options = [])
@@ -58,7 +55,7 @@ class MemcachedSessionHandler extends AbstractSessionHandler
     }
 
     /**
-     * {@inheritdoc}
+     * @return bool
      */
     public function close()
     {
@@ -74,7 +71,7 @@ class MemcachedSessionHandler extends AbstractSessionHandler
     }
 
     /**
-     * {@inheritdoc}
+     * @return bool
      */
     public function updateTimestamp($sessionId, $data)
     {
@@ -102,7 +99,7 @@ class MemcachedSessionHandler extends AbstractSessionHandler
     }
 
     /**
-     * {@inheritdoc}
+     * @return bool
      */
     public function gc($maxlifetime)
     {
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php
index 3b5ccaa..db85f06 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php
@@ -17,14 +17,14 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
  * @author Markus Bachmann <markus.bachmann@bachi.biz>
  *
  * @see https://packagist.org/packages/mongodb/mongodb
- * @see http://php.net/manual/en/set.mongodb.php
+ * @see https://php.net/mongodb
  */
 class MongoDbSessionHandler extends AbstractSessionHandler
 {
     private $mongo;
 
     /**
-     * @var \MongoCollection
+     * @var \MongoDB\Collection
      */
     private $collection;
 
@@ -56,7 +56,7 @@ class MongoDbSessionHandler extends AbstractSessionHandler
      *         { "expireAfterSeconds": 0 }
      *     )
      *
-     * More details on: http://docs.mongodb.org/manual/tutorial/expire-data/
+     * More details on: https://docs.mongodb.org/manual/tutorial/expire-data/
      *
      * If you use such an index, you can drop `gc_probability` to 0 since
      * no garbage-collection is required.
@@ -64,19 +64,10 @@ class MongoDbSessionHandler extends AbstractSessionHandler
      * @param \MongoDB\Client $mongo   A MongoDB\Client instance
      * @param array           $options An associative array of field options
      *
-     * @throws \InvalidArgumentException When MongoClient or Mongo instance not provided
      * @throws \InvalidArgumentException When "database" or "collection" not provided
      */
-    public function __construct($mongo, array $options)
+    public function __construct(\MongoDB\Client $mongo, array $options)
     {
-        if ($mongo instanceof \MongoClient || $mongo instanceof \Mongo) {
-            @trigger_error(sprintf('Using %s with the legacy mongo extension is deprecated as of 3.4 and will be removed in 4.0. Use it with the mongodb/mongodb package and ext-mongodb instead.', __CLASS__), E_USER_DEPRECATED);
-        }
-
-        if (!($mongo instanceof \MongoDB\Client || $mongo instanceof \MongoClient || $mongo instanceof \Mongo)) {
-            throw new \InvalidArgumentException('MongoClient or Mongo instance required');
-        }
-
         if (!isset($options['database']) || !isset($options['collection'])) {
             throw new \InvalidArgumentException('You must provide the "database" and "collection" option for MongoDBSessionHandler');
         }
@@ -104,9 +95,7 @@ class MongoDbSessionHandler extends AbstractSessionHandler
      */
     protected function doDestroy($sessionId)
     {
-        $methodName = $this->mongo instanceof \MongoDB\Client ? 'deleteOne' : 'remove';
-
-        $this->getCollection()->$methodName([
+        $this->getCollection()->deleteOne([
             $this->options['id_field'] => $sessionId,
         ]);
 
@@ -118,10 +107,8 @@ class MongoDbSessionHandler extends AbstractSessionHandler
      */
     public function gc($maxlifetime)
     {
-        $methodName = $this->mongo instanceof \MongoDB\Client ? 'deleteMany' : 'remove';
-
-        $this->getCollection()->$methodName([
-            $this->options['expiry_field'] => ['$lt' => $this->createDateTime()],
+        $this->getCollection()->deleteMany([
+            $this->options['expiry_field'] => ['$lt' => new \MongoDB\BSON\UTCDateTime()],
         ]);
 
         return true;
@@ -132,28 +119,18 @@ class MongoDbSessionHandler extends AbstractSessionHandler
      */
     protected function doWrite($sessionId, $data)
     {
-        $expiry = $this->createDateTime(time() + (int) ini_get('session.gc_maxlifetime'));
+        $expiry = new \MongoDB\BSON\UTCDateTime((time() + (int) ini_get('session.gc_maxlifetime')) * 1000);
 
         $fields = [
-            $this->options['time_field'] => $this->createDateTime(),
+            $this->options['time_field'] => new \MongoDB\BSON\UTCDateTime(),
             $this->options['expiry_field'] => $expiry,
+            $this->options['data_field'] => new \MongoDB\BSON\Binary($data, \MongoDB\BSON\Binary::TYPE_OLD_BINARY),
         ];
 
-        $options = ['upsert' => true];
-
-        if ($this->mongo instanceof \MongoDB\Client) {
-            $fields[$this->options['data_field']] = new \MongoDB\BSON\Binary($data, \MongoDB\BSON\Binary::TYPE_OLD_BINARY);
-        } else {
-            $fields[$this->options['data_field']] = new \MongoBinData($data, \MongoBinData::BYTE_ARRAY);
-            $options['multiple'] = false;
-        }
-
-        $methodName = $this->mongo instanceof \MongoDB\Client ? 'updateOne' : 'update';
-
-        $this->getCollection()->$methodName(
+        $this->getCollection()->updateOne(
             [$this->options['id_field'] => $sessionId],
             ['$set' => $fields],
-            $options
+            ['upsert' => true]
         );
 
         return true;
@@ -164,23 +141,14 @@ class MongoDbSessionHandler extends AbstractSessionHandler
      */
     public function updateTimestamp($sessionId, $data)
     {
-        $expiry = $this->createDateTime(time() + (int) ini_get('session.gc_maxlifetime'));
-
-        if ($this->mongo instanceof \MongoDB\Client) {
-            $methodName = 'updateOne';
-            $options = [];
-        } else {
-            $methodName = 'update';
-            $options = ['multiple' => false];
-        }
+        $expiry = new \MongoDB\BSON\UTCDateTime((time() + (int) ini_get('session.gc_maxlifetime')) * 1000);
 
-        $this->getCollection()->$methodName(
+        $this->getCollection()->updateOne(
             [$this->options['id_field'] => $sessionId],
             ['$set' => [
-                $this->options['time_field'] => $this->createDateTime(),
+                $this->options['time_field'] => new \MongoDB\BSON\UTCDateTime(),
                 $this->options['expiry_field'] => $expiry,
-            ]],
-            $options
+            ]]
         );
 
         return true;
@@ -193,24 +161,18 @@ class MongoDbSessionHandler extends AbstractSessionHandler
     {
         $dbData = $this->getCollection()->findOne([
             $this->options['id_field'] => $sessionId,
-            $this->options['expiry_field'] => ['$gte' => $this->createDateTime()],
+            $this->options['expiry_field'] => ['$gte' => new \MongoDB\BSON\UTCDateTime()],
         ]);
 
         if (null === $dbData) {
             return '';
         }
 
-        if ($dbData[$this->options['data_field']] instanceof \MongoDB\BSON\Binary) {
-            return $dbData[$this->options['data_field']]->getData();
-        }
-
-        return $dbData[$this->options['data_field']]->bin;
+        return $dbData[$this->options['data_field']]->getData();
     }
 
     /**
-     * Return a "MongoCollection" instance.
-     *
-     * @return \MongoCollection
+     * @return \MongoDB\Collection
      */
     private function getCollection()
     {
@@ -222,34 +184,10 @@ class MongoDbSessionHandler extends AbstractSessionHandler
     }
 
     /**
-     * Return a Mongo instance.
-     *
-     * @return \Mongo|\MongoClient|\MongoDB\Client
+     * @return \MongoDB\Client
      */
     protected function getMongo()
     {
         return $this->mongo;
     }
-
-    /**
-     * Create a date object using the class appropriate for the current mongo connection.
-     *
-     * Return an instance of a MongoDate or \MongoDB\BSON\UTCDateTime
-     *
-     * @param int $seconds An integer representing UTC seconds since Jan 1 1970.  Defaults to now.
-     *
-     * @return \MongoDate|\MongoDB\BSON\UTCDateTime
-     */
-    private function createDateTime($seconds = null)
-    {
-        if (null === $seconds) {
-            $seconds = time();
-        }
-
-        if ($this->mongo instanceof \MongoDB\Client) {
-            return new \MongoDB\BSON\UTCDateTime($seconds * 1000);
-        }
-
-        return new \MongoDate($seconds);
-    }
 }
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php
index 4e9704b..bdfc9d8 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php
@@ -16,19 +16,19 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
  *
  * @author Drak <drak@zikula.org>
  */
-class NativeFileSessionHandler extends NativeSessionHandler
+class NativeFileSessionHandler extends \SessionHandler
 {
     /**
      * @param string $savePath Path of directory to save session files
      *                         Default null will leave setting as defined by PHP.
      *                         '/path', 'N;/path', or 'N;octal-mode;/path
      *
-     * @see http://php.net/session.configuration.php#ini.session.save-path for further details.
+     * @see https://php.net/session.configuration#ini.session.save-path for further details.
      *
      * @throws \InvalidArgumentException On invalid $savePath
      * @throws \RuntimeException         When failing to create the save directory
      */
-    public function __construct($savePath = null)
+    public function __construct(string $savePath = null)
     {
         if (null === $savePath) {
             $savePath = ini_get('session.save_path');
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/NativeSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/NativeSessionHandler.php
deleted file mode 100644
index 9be4528..0000000
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/NativeSessionHandler.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
-
-/**
- * @deprecated since version 3.4, to be removed in 4.0. Use \SessionHandler instead.
- * @see http://php.net/sessionhandler
- */
-class NativeSessionHandler extends \SessionHandler
-{
-    public function __construct()
-    {
-        @trigger_error('The '.__NAMESPACE__.'\NativeSessionHandler class is deprecated since Symfony 3.4 and will be removed in 4.0. Use the \SessionHandler class instead.', E_USER_DEPRECATED);
-    }
-}
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php
index 8d19315..3ba9378 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php
@@ -67,7 +67,7 @@ class NullSessionHandler extends AbstractSessionHandler
     }
 
     /**
-     * {@inheritdoc}
+     * @return bool
      */
     public function gc($maxlifetime)
     {
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php
index 9369740..4f770c1 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php
@@ -32,7 +32,7 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
  * Saving it in a character column could corrupt the data. You can use createTable()
  * to initialize a correctly defined table.
  *
- * @see http://php.net/sessionhandlerinterface
+ * @see https://php.net/sessionhandlerinterface
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Michael Williams <michael.williams@funsational.com>
@@ -286,7 +286,7 @@ class PdoSessionHandler extends AbstractSessionHandler
     }
 
     /**
-     * {@inheritdoc}
+     * @return bool
      */
     public function gc($maxlifetime)
     {
@@ -538,7 +538,7 @@ class PdoSessionHandler extends AbstractSessionHandler
      * PDO::rollback or PDO::inTransaction for SQLite.
      *
      * Also MySQLs default isolation, REPEATABLE READ, causes deadlock for different sessions
-     * due to http://www.mysqlperformanceblog.com/2013/12/12/one-more-innodb-gap-lock-to-avoid/ .
+     * due to https://percona.com/blog/2013/12/12/one-more-innodb-gap-lock-to-avoid/ .
      * So we change it to READ COMMITTED.
      */
     private function beginTransaction()
@@ -668,8 +668,6 @@ class PdoSessionHandler extends AbstractSessionHandler
     /**
      * Executes an application-level lock on the database.
      *
-     * @param string $sessionId Session ID
-     *
      * @return \PDOStatement The statement that needs to be executed later to release the lock
      *
      * @throws \DomainException When an unsupported PDO driver is used
@@ -678,7 +676,7 @@ class PdoSessionHandler extends AbstractSessionHandler
      *       - for oci using DBMS_LOCK.REQUEST
      *       - for sqlsrv using sp_getapplock with LockOwner = Session
      */
-    private function doAdvisoryLock($sessionId)
+    private function doAdvisoryLock(string $sessionId)
     {
         switch ($this->driver) {
             case 'mysql':
@@ -733,12 +731,8 @@ class PdoSessionHandler extends AbstractSessionHandler
      * Encodes the first 4 (when PHP_INT_SIZE == 4) or 8 characters of the string as an integer.
      *
      * Keep in mind, PHP integers are signed.
-     *
-     * @param string $string
-     *
-     * @return int
      */
-    private function convertStringToInt($string)
+    private function convertStringToInt(string $string): int
     {
         if (4 === \PHP_INT_SIZE) {
             return (\ord($string[3]) << 24) + (\ord($string[2]) << 16) + (\ord($string[1]) << 8) + \ord($string[0]);
@@ -753,11 +747,9 @@ class PdoSessionHandler extends AbstractSessionHandler
     /**
      * Return a locking or nonlocking SQL query to read session information.
      *
-     * @return string The SQL string
-     *
      * @throws \DomainException When an unsupported PDO driver is used
      */
-    private function getSelectSql()
+    private function getSelectSql(): string
     {
         if (self::LOCK_TRANSACTIONAL === $this->lockMode) {
             $this->beginTransaction();
@@ -848,14 +840,8 @@ class PdoSessionHandler extends AbstractSessionHandler
 
     /**
      * Returns a merge/upsert (i.e. insert or update) statement when supported by the database for writing session data.
-     *
-     * @param string $sessionId   Session ID
-     * @param string $data        Encoded session data
-     * @param int    $maxlifetime session.gc_maxlifetime
-     *
-     * @return \PDOStatement|null The merge statement or null when not supported
      */
-    private function getMergeStatement($sessionId, $data, $maxlifetime)
+    private function getMergeStatement(string $sessionId, string $data, int $maxlifetime): ?\PDOStatement
     {
         switch (true) {
             case 'mysql' === $this->driver:
@@ -864,7 +850,7 @@ class PdoSessionHandler extends AbstractSessionHandler
                 break;
             case 'sqlsrv' === $this->driver && version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '10', '>='):
                 // MERGE is only available since SQL Server 2008 and must be terminated by semicolon
-                // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx
+                // It also requires HOLDLOCK according to https://weblogs.sqlteam.com/dang/2009/01/31/upsert-race-condition-with-merge/
                 $mergeSql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ".
                     "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
                     "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;";
@@ -877,7 +863,7 @@ class PdoSessionHandler extends AbstractSessionHandler
                     "ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)";
                 break;
             default:
-                // MERGE is not supported with LOBs: http://www.oracle.com/technetwork/articles/fuecks-lobs-095315.html
+                // MERGE is not supported with LOBs: https://oracle.com/technetwork/articles/fuecks-lobs-095315.html
                 return null;
         }
 
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php
index 83a1f2c..fab8e9a 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php
@@ -94,7 +94,7 @@ class StrictSessionHandler extends AbstractSessionHandler
     }
 
     /**
-     * {@inheritdoc}
+     * @return bool
      */
     public function gc($maxlifetime)
     {
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/WriteCheckSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/WriteCheckSessionHandler.php
deleted file mode 100644
index 127e47f..0000000
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/WriteCheckSessionHandler.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
-
-/**
- * Wraps another SessionHandlerInterface to only write the session when it has been modified.
- *
- * @author Adrien Brault <adrien.brault@gmail.com>
- *
- * @deprecated since version 3.4, to be removed in 4.0. Implement `SessionUpdateTimestampHandlerInterface` or extend `AbstractSessionHandler` instead.
- */
-class WriteCheckSessionHandler implements \SessionHandlerInterface
-{
-    private $wrappedSessionHandler;
-
-    /**
-     * @var array sessionId => session
-     */
-    private $readSessions;
-
-    public function __construct(\SessionHandlerInterface $wrappedSessionHandler)
-    {
-        @trigger_error(sprintf('The %s class is deprecated since Symfony 3.4 and will be removed in 4.0. Implement `SessionUpdateTimestampHandlerInterface` or extend `AbstractSessionHandler` instead.', self::class), E_USER_DEPRECATED);
-
-        $this->wrappedSessionHandler = $wrappedSessionHandler;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function close()
-    {
-        return $this->wrappedSessionHandler->close();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function destroy($sessionId)
-    {
-        return $this->wrappedSessionHandler->destroy($sessionId);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function gc($maxlifetime)
-    {
-        return $this->wrappedSessionHandler->gc($maxlifetime);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function open($savePath, $sessionName)
-    {
-        return $this->wrappedSessionHandler->open($savePath, $sessionName);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function read($sessionId)
-    {
-        $session = $this->wrappedSessionHandler->read($sessionId);
-
-        $this->readSessions[$sessionId] = $session;
-
-        return $session;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function write($sessionId, $data)
-    {
-        if (isset($this->readSessions[$sessionId]) && $data === $this->readSessions[$sessionId]) {
-            return true;
-        }
-
-        return $this->wrappedSessionHandler->write($sessionId, $data);
-    }
-}
diff --git a/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php b/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php
index a62f108..2eff410 100644
--- a/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php
+++ b/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php
@@ -57,7 +57,7 @@ class MetadataBag implements SessionBagInterface
      * @param string $storageKey      The key used to store bag in the session
      * @param int    $updateThreshold The time to wait between two UPDATED updates
      */
-    public function __construct($storageKey = '_sf2_meta', $updateThreshold = 0)
+    public function __construct(string $storageKey = '_sf2_meta', int $updateThreshold = 0)
     {
         $this->storageKey = $storageKey;
         $this->updateThreshold = $updateThreshold;
diff --git a/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php
index c1e7523..37b6f14 100644
--- a/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php
+++ b/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php
@@ -62,11 +62,7 @@ class MockArraySessionStorage implements SessionStorageInterface
      */
     protected $bags = [];
 
-    /**
-     * @param string      $name    Session name
-     * @param MetadataBag $metaBag MetadataBag instance
-     */
-    public function __construct($name = 'MOCKSESSID', MetadataBag $metaBag = null)
+    public function __construct(string $name = 'MOCKSESSID', MetadataBag $metaBag = null)
     {
         $this->name = $name;
         $this->setMetadataBag($metaBag);
diff --git a/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php
index 9bbd1ba..c0316c2 100644
--- a/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php
+++ b/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php
@@ -31,7 +31,7 @@ class MockFileSessionStorage extends MockArraySessionStorage
      * @param string      $name     Session name
      * @param MetadataBag $metaBag  MetadataBag instance
      */
-    public function __construct($savePath = null, $name = 'MOCKSESSID', MetadataBag $metaBag = null)
+    public function __construct(string $savePath = null, string $name = 'MOCKSESSID', MetadataBag $metaBag = null)
     {
         if (null === $savePath) {
             $savePath = sys_get_temp_dir();
diff --git a/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php
index c4dbe75..202f3a5 100644
--- a/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php
+++ b/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php
@@ -12,6 +12,7 @@
 namespace Symfony\Component\HttpFoundation\Session\Storage;
 
 use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
+use Symfony\Component\HttpFoundation\Session\SessionUtils;
 use Symfony\Component\HttpFoundation\Session\Storage\Handler\StrictSessionHandler;
 use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy;
 use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;
@@ -49,12 +50,17 @@ class NativeSessionStorage implements SessionStorageInterface
     protected $metadataBag;
 
     /**
+     * @var string|null
+     */
+    private $emulateSameSite;
+
+    /**
      * Depending on how you want the storage driver to behave you probably
      * want to override this constructor entirely.
      *
      * List of options for $options array with their defaults.
      *
-     * @see http://php.net/session.configuration for options
+     * @see https://php.net/session.configuration for options
      * but we omit 'session.' from the beginning of the keys for convenience.
      *
      * ("auto_start", is not supported as it tells PHP to start a session before
@@ -67,13 +73,10 @@ class NativeSessionStorage implements SessionStorageInterface
      * cookie_lifetime, "0"
      * cookie_path, "/"
      * cookie_secure, ""
-     * entropy_file, ""
-     * entropy_length, "0"
+     * cookie_samesite, null
      * gc_divisor, "100"
      * gc_maxlifetime, "1440"
      * gc_probability, "1"
-     * hash_bits_per_character, "4"
-     * hash_function, "0"
      * lazy_write, "1"
      * name, "PHPSESSID"
      * referer_check, ""
@@ -100,11 +103,16 @@ class NativeSessionStorage implements SessionStorageInterface
      */
     public function __construct(array $options = [], $handler = null, MetadataBag $metaBag = null)
     {
+        if (!\extension_loaded('session')) {
+            throw new \LogicException('PHP extension "session" is required.');
+        }
+
         $options += [
             'cache_limiter' => '',
             'cache_expire' => 0,
             'use_cookies' => 1,
             'lazy_write' => 1,
+            'use_strict_mode' => 1,
         ];
 
         session_register_shutdown();
@@ -146,6 +154,13 @@ class NativeSessionStorage implements SessionStorageInterface
             throw new \RuntimeException('Failed to start the session');
         }
 
+        if (null !== $this->emulateSameSite) {
+            $originalCookie = SessionUtils::popSessionCookie(session_name(), session_id());
+            if (null !== $originalCookie) {
+                header(sprintf('%s; SameSite=%s', $originalCookie, $this->emulateSameSite), false);
+            }
+        }
+
         $this->loadSession();
 
         return true;
@@ -208,9 +223,16 @@ class NativeSessionStorage implements SessionStorageInterface
         $isRegenerated = session_regenerate_id($destroy);
 
         // The reference to $_SESSION in session bags is lost in PHP7 and we need to re-create it.
-        // @see https://bugs.php.net/bug.php?id=70013
+        // @see https://bugs.php.net/70013
         $this->loadSession();
 
+        if (null !== $this->emulateSameSite) {
+            $originalCookie = SessionUtils::popSessionCookie(session_name(), session_id());
+            if (null !== $originalCookie) {
+                header(sprintf('%s; SameSite=%s', $originalCookie, $this->emulateSameSite), false);
+            }
+        }
+
         return $isRegenerated;
     }
 
@@ -219,6 +241,7 @@ class NativeSessionStorage implements SessionStorageInterface
      */
     public function save()
     {
+        // Store a copy so we can restore the bags in case the session was not left empty
         $session = $_SESSION;
 
         foreach ($this->bags as $bag) {
@@ -244,7 +267,11 @@ class NativeSessionStorage implements SessionStorageInterface
             session_write_close();
         } finally {
             restore_error_handler();
-            $_SESSION = $session;
+
+            // Restore only if not empty
+            if ($_SESSION) {
+                $_SESSION = $session;
+            }
         }
 
         $this->closed = true;
@@ -333,7 +360,7 @@ class NativeSessionStorage implements SessionStorageInterface
      *
      * @param array $options Session ini directives [key => value]
      *
-     * @see http://php.net/session.configuration
+     * @see https://php.net/session.configuration
      */
     public function setOptions(array $options)
     {
@@ -343,10 +370,9 @@ class NativeSessionStorage implements SessionStorageInterface
 
         $validOptions = array_flip([
             'cache_expire', 'cache_limiter', 'cookie_domain', 'cookie_httponly',
-            'cookie_lifetime', 'cookie_path', 'cookie_secure',
-            'entropy_file', 'entropy_length', 'gc_divisor',
-            'gc_maxlifetime', 'gc_probability', 'hash_bits_per_character',
-            'hash_function', 'lazy_write', 'name', 'referer_check',
+            'cookie_lifetime', 'cookie_path', 'cookie_secure', 'cookie_samesite',
+            'gc_divisor', 'gc_maxlifetime', 'gc_probability',
+            'lazy_write', 'name', 'referer_check',
             'serialize_handler', 'use_strict_mode', 'use_cookies',
             'use_only_cookies', 'use_trans_sid', 'upload_progress.enabled',
             'upload_progress.cleanup', 'upload_progress.prefix', 'upload_progress.name',
@@ -356,6 +382,12 @@ class NativeSessionStorage implements SessionStorageInterface
 
         foreach ($options as $key => $value) {
             if (isset($validOptions[$key])) {
+                if ('cookie_samesite' === $key && \PHP_VERSION_ID < 70300) {
+                    // PHP < 7.3 does not support same_site cookies. We will emulate it in
+                    // the start() method instead.
+                    $this->emulateSameSite = $value;
+                    continue;
+                }
                 ini_set('url_rewriter.tags' !== $key ? 'session.'.$key : $key, $value);
             }
         }
@@ -374,10 +406,10 @@ class NativeSessionStorage implements SessionStorageInterface
      * constructor, for a template see NativeFileSessionHandler or use handlers in
      * composer package drak/native-session
      *
-     * @see http://php.net/session-set-save-handler
-     * @see http://php.net/sessionhandlerinterface
-     * @see http://php.net/sessionhandler
-     * @see http://github.com/drak/NativeSession
+     * @see https://php.net/session-set-save-handler
+     * @see https://php.net/sessionhandlerinterface
+     * @see https://php.net/sessionhandler
+     * @see https://github.com/zikula/NativeSession
      *
      * @param \SessionHandlerInterface|null $saveHandler
      *
@@ -426,7 +458,7 @@ class NativeSessionStorage implements SessionStorageInterface
 
         foreach ($bags as $bag) {
             $key = $bag->getStorageKey();
-            $session[$key] = isset($session[$key]) ? $session[$key] : [];
+            $session[$key] = isset($session[$key]) && \is_array($session[$key]) ? $session[$key] : [];
             $bag->initialize($session[$key]);
         }
 
diff --git a/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php
index 662ed50..8969e60 100644
--- a/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php
+++ b/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php
@@ -24,6 +24,10 @@ class PhpBridgeSessionStorage extends NativeSessionStorage
      */
     public function __construct($handler = null, MetadataBag $metaBag = null)
     {
+        if (!\extension_loaded('session')) {
+            throw new \LogicException('PHP extension "session" is required.');
+        }
+
         $this->setMetadataBag($metaBag);
         $this->setSaveHandler($handler);
     }
diff --git a/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php b/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php
index 09c9248..0303729 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php
@@ -31,7 +31,7 @@ abstract class AbstractProxy
     /**
      * Gets the session.save_handler name.
      *
-     * @return string
+     * @return string|null
      */
     public function getSaveHandlerName()
     {
diff --git a/vendor/symfony/http-foundation/Session/Storage/Proxy/NativeProxy.php b/vendor/symfony/http-foundation/Session/Storage/Proxy/NativeProxy.php
deleted file mode 100644
index 082eed1..0000000
--- a/vendor/symfony/http-foundation/Session/Storage/Proxy/NativeProxy.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;
-
-@trigger_error('The '.__NAMESPACE__.'\NativeProxy class is deprecated since Symfony 3.4 and will be removed in 4.0. Use your session handler implementation directly.', E_USER_DEPRECATED);
-
-/**
- * This proxy is built-in session handlers in PHP 5.3.x.
- *
- * @deprecated since version 3.4, to be removed in 4.0. Use your session handler implementation directly.
- *
- * @author Drak <drak@zikula.org>
- */
-class NativeProxy extends AbstractProxy
-{
-    public function __construct()
-    {
-        // this makes an educated guess as to what the handler is since it should already be set.
-        $this->saveHandlerName = ini_get('session.save_handler');
-    }
-
-    /**
-     * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler.
-     *
-     * @return bool False
-     */
-    public function isWrapper()
-    {
-        return false;
-    }
-}
diff --git a/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php b/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php
index b11cc39..e40712d 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php
@@ -76,7 +76,7 @@ class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterf
     }
 
     /**
-     * {@inheritdoc}
+     * @return bool
      */
     public function gc($maxlifetime)
     {
diff --git a/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php b/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php
index 66e8b33..eeb396a 100644
--- a/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php
+++ b/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php
@@ -77,7 +77,7 @@ interface SessionStorageInterface
      * only delete the session data from persistent storage.
      *
      * Care: When regenerating the session ID no locking is involved in PHP's
-     * session design. See https://bugs.php.net/bug.php?id=61470 for a discussion.
+     * session design. See https://bugs.php.net/61470 for a discussion.
      * So you must make sure the regenerated session is saved BEFORE sending the
      * headers with the new ID. Symfony's HttpKernel offers a listener for this.
      * See Symfony\Component\HttpKernel\EventListener\SaveSessionListener.
diff --git a/vendor/symfony/http-foundation/StreamedResponse.php b/vendor/symfony/http-foundation/StreamedResponse.php
index 8bc5fc9..bfbcae9 100644
--- a/vendor/symfony/http-foundation/StreamedResponse.php
+++ b/vendor/symfony/http-foundation/StreamedResponse.php
@@ -35,7 +35,7 @@ class StreamedResponse extends Response
      * @param int           $status   The response status code
      * @param array         $headers  An array of response headers
      */
-    public function __construct(callable $callback = null, $status = 200, $headers = [])
+    public function __construct(callable $callback = null, int $status = 200, array $headers = [])
     {
         parent::__construct(null, $status, $headers);
 
@@ -111,7 +111,7 @@ class StreamedResponse extends Response
             throw new \LogicException('The Response callback must not be null.');
         }
 
-        \call_user_func($this->callback);
+        ($this->callback)();
 
         return $this;
     }
@@ -136,8 +136,6 @@ class StreamedResponse extends Response
 
     /**
      * {@inheritdoc}
-     *
-     * @return false
      */
     public function getContent()
     {
diff --git a/vendor/symfony/http-foundation/Tests/AcceptHeaderItemTest.php b/vendor/symfony/http-foundation/Tests/AcceptHeaderItemTest.php
index a40a762..516bd55 100644
--- a/vendor/symfony/http-foundation/Tests/AcceptHeaderItemTest.php
+++ b/vendor/symfony/http-foundation/Tests/AcceptHeaderItemTest.php
@@ -66,7 +66,7 @@ class AcceptHeaderItemTest extends TestCase
             ],
             [
                 'text/plain', ['charset' => 'utf-8', 'param' => 'this;should,not=matter', 'footnotes' => 'true'],
-                'text/plain;charset=utf-8;param="this;should,not=matter";footnotes=true',
+                'text/plain; charset=utf-8; param="this;should,not=matter"; footnotes=true',
             ],
         ];
     }
diff --git a/vendor/symfony/http-foundation/Tests/AcceptHeaderTest.php b/vendor/symfony/http-foundation/Tests/AcceptHeaderTest.php
index 3199869..1987e97 100644
--- a/vendor/symfony/http-foundation/Tests/AcceptHeaderTest.php
+++ b/vendor/symfony/http-foundation/Tests/AcceptHeaderTest.php
@@ -100,4 +100,31 @@ class AcceptHeaderTest extends TestCase
             'order matters when q is equal2' => ['*;q=0.3,utf-8;q=0.7,ISO-8859-1;q=0.7', ['utf-8', 'ISO-8859-1', '*']],
         ];
     }
+
+    /**
+     * @dataProvider provideDefaultValueData
+     */
+    public function testDefaultValue($acceptHeader, $value, $expectedQuality)
+    {
+        $header = AcceptHeader::fromString($acceptHeader);
+        $this->assertSame($expectedQuality, $header->get($value)->getQuality());
+    }
+
+    public function provideDefaultValueData()
+    {
+        yield ['text/plain;q=0.5, text/html, text/x-dvi;q=0.8, *;q=0.3', 'text/xml', 0.3];
+        yield ['text/plain;q=0.5, text/html, text/x-dvi;q=0.8, */*;q=0.3', 'text/xml', 0.3];
+        yield ['text/plain;q=0.5, text/html, text/x-dvi;q=0.8, */*;q=0.3', 'text/html', 1.0];
+        yield ['text/plain;q=0.5, text/html, text/x-dvi;q=0.8, */*;q=0.3', 'text/plain', 0.5];
+        yield ['text/plain;q=0.5, text/html, text/x-dvi;q=0.8, */*;q=0.3', '*', 0.3];
+        yield ['text/plain;q=0.5, text/html, text/x-dvi;q=0.8, */*', '*', 1.0];
+        yield ['text/plain;q=0.5, text/html, text/x-dvi;q=0.8, */*', 'text/xml', 1.0];
+        yield ['text/plain;q=0.5, text/html, text/x-dvi;q=0.8, */*', 'text/*', 1.0];
+        yield ['text/plain;q=0.5, text/html, text/*;q=0.8, */*', 'text/*', 0.8];
+        yield ['text/plain;q=0.5, text/html, text/*;q=0.8, */*', 'text/html', 1.0];
+        yield ['text/plain;q=0.5, text/html, text/*;q=0.8, */*', 'text/x-dvi', 0.8];
+        yield ['*;q=0.3, ISO-8859-1;q=0.7, utf-8;q=0.7', '*', 0.3];
+        yield ['*;q=0.3, ISO-8859-1;q=0.7, utf-8;q=0.7', 'utf-8', 0.7];
+        yield ['*;q=0.3, ISO-8859-1;q=0.7, utf-8;q=0.7', 'SHIFT_JIS', 0.3];
+    }
 }
diff --git a/vendor/symfony/http-foundation/Tests/BinaryFileResponseTest.php b/vendor/symfony/http-foundation/Tests/BinaryFileResponseTest.php
index 853b4bb..734f8e8 100644
--- a/vendor/symfony/http-foundation/Tests/BinaryFileResponseTest.php
+++ b/vendor/symfony/http-foundation/Tests/BinaryFileResponseTest.php
@@ -32,7 +32,7 @@ class BinaryFileResponseTest extends ResponseTestCase
         $response = BinaryFileResponse::create($file, 404, [], true, ResponseHeaderBag::DISPOSITION_INLINE);
         $this->assertEquals(404, $response->getStatusCode());
         $this->assertFalse($response->headers->has('ETag'));
-        $this->assertEquals('inline; filename="README.md"', $response->headers->get('Content-Disposition'));
+        $this->assertEquals('inline; filename=README.md', $response->headers->get('Content-Disposition'));
     }
 
     public function testConstructWithNonAsciiFilename()
@@ -46,11 +46,9 @@ class BinaryFileResponseTest extends ResponseTestCase
         $this->assertSame('fööö.html', $response->getFile()->getFilename());
     }
 
-    /**
-     * @expectedException \LogicException
-     */
     public function testSetContent()
     {
+        $this->expectException('LogicException');
         $response = new BinaryFileResponse(__FILE__);
         $response->setContent('foo');
     }
@@ -66,7 +64,7 @@ class BinaryFileResponseTest extends ResponseTestCase
         $response = new BinaryFileResponse(__FILE__);
         $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'föö.html');
 
-        $this->assertSame('attachment; filename="f__.html"; filename*=utf-8\'\'f%C3%B6%C3%B6.html', $response->headers->get('Content-Disposition'));
+        $this->assertSame('attachment; filename=f__.html; filename*=utf-8\'\'f%C3%B6%C3%B6.html', $response->headers->get('Content-Disposition'));
     }
 
     public function testSetContentDispositionGeneratesSafeFallbackFilenameForWronglyEncodedFilename()
@@ -77,7 +75,7 @@ class BinaryFileResponseTest extends ResponseTestCase
         $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $iso88591EncodedFilename);
 
         // the parameter filename* is invalid in this case (rawurldecode('f%F6%F6') does not provide a UTF-8 string but an ISO-8859-1 encoded one)
-        $this->assertSame('attachment; filename="f__.html"; filename*=utf-8\'\'f%F6%F6.html', $response->headers->get('Content-Disposition'));
+        $this->assertSame('attachment; filename=f__.html; filename*=utf-8\'\'f%F6%F6.html', $response->headers->get('Content-Disposition'));
     }
 
     /**
@@ -109,7 +107,7 @@ class BinaryFileResponseTest extends ResponseTestCase
 
         $this->assertEquals(206, $response->getStatusCode());
         $this->assertEquals($responseRange, $response->headers->get('Content-Range'));
-        $this->assertSame($length, $response->headers->get('Content-Length'));
+        $this->assertSame((string) $length, $response->headers->get('Content-Length'));
     }
 
     /**
@@ -263,7 +261,7 @@ class BinaryFileResponseTest extends ResponseTestCase
         $this->expectOutputString('');
         $response->sendContent();
 
-        $this->assertContains('README.md', $response->headers->get('X-Sendfile'));
+        $this->assertStringContainsString('README.md', $response->headers->get('X-Sendfile'));
     }
 
     public function provideXSendfileFiles()
@@ -337,7 +335,8 @@ class BinaryFileResponseTest extends ResponseTestCase
     {
         return [
             ['/var/www/var/www/files/foo.txt', '/var/www/=/files/', '/files/var/www/files/foo.txt'],
-            ['/home/foo/bar.txt', '/var/www/=/files/,/home/foo/=/baz/', '/baz/bar.txt'],
+            ['/home/Foo/bar.txt', '/var/www/=/files/,/home/Foo/=/baz/', '/baz/bar.txt'],
+            ['/home/Foo/bar.txt', '"/var/www/"="/files/", "/home/Foo/"="/baz/"', '/baz/bar.txt'],
             ['/tmp/bar.txt', '"/var/www/"="/files/", "/home/Foo/"="/baz/"', null],
         ];
     }
@@ -356,7 +355,7 @@ class BinaryFileResponseTest extends ResponseTestCase
         return new BinaryFileResponse(__DIR__.'/../README.md', 200, ['Content-Type' => 'application/octet-stream']);
     }
 
-    public static function tearDownAfterClass()
+    public static function tearDownAfterClass(): void
     {
         $path = __DIR__.'/../Fixtures/to_delete';
         if (file_exists($path)) {
diff --git a/vendor/symfony/http-foundation/Tests/CookieTest.php b/vendor/symfony/http-foundation/Tests/CookieTest.php
index aaf2edb..55287e0 100644
--- a/vendor/symfony/http-foundation/Tests/CookieTest.php
+++ b/vendor/symfony/http-foundation/Tests/CookieTest.php
@@ -24,10 +24,9 @@ use Symfony\Component\HttpFoundation\Cookie;
  */
 class CookieTest extends TestCase
 {
-    public function invalidNames()
+    public function namesWithSpecialCharacters()
     {
         return [
-            [''],
             [',MyName'],
             [';MyName'],
             [' MyName'],
@@ -40,25 +39,37 @@ class CookieTest extends TestCase
     }
 
     /**
-     * @dataProvider invalidNames
-     * @expectedException \InvalidArgumentException
+     * @dataProvider namesWithSpecialCharacters
      */
-    public function testInstantiationThrowsExceptionIfCookieNameContainsInvalidCharacters($name)
+    public function testInstantiationThrowsExceptionIfRawCookieNameContainsSpecialCharacters($name)
     {
-        new Cookie($name);
+        $this->expectException('InvalidArgumentException');
+        Cookie::create($name, null, 0, null, null, null, false, true);
     }
 
     /**
-     * @expectedException \InvalidArgumentException
+     * @dataProvider namesWithSpecialCharacters
      */
+    public function testInstantiationSucceedNonRawCookieNameContainsSpecialCharacters($name)
+    {
+        $this->assertInstanceOf(Cookie::class, Cookie::create($name));
+    }
+
+    public function testInstantiationThrowsExceptionIfCookieNameIsEmpty()
+    {
+        $this->expectException('InvalidArgumentException');
+        Cookie::create('');
+    }
+
     public function testInvalidExpiration()
     {
-        new Cookie('MyCookie', 'foo', 'bar');
+        $this->expectException('InvalidArgumentException');
+        Cookie::create('MyCookie', 'foo', 'bar');
     }
 
     public function testNegativeExpirationIsNotPossible()
     {
-        $cookie = new Cookie('foo', 'bar', -100);
+        $cookie = Cookie::create('foo', 'bar', -100);
 
         $this->assertSame(0, $cookie->getExpiresTime());
     }
@@ -66,32 +77,32 @@ class CookieTest extends TestCase
     public function testGetValue()
     {
         $value = 'MyValue';
-        $cookie = new Cookie('MyCookie', $value);
+        $cookie = Cookie::create('MyCookie', $value);
 
         $this->assertSame($value, $cookie->getValue(), '->getValue() returns the proper value');
     }
 
     public function testGetPath()
     {
-        $cookie = new Cookie('foo', 'bar');
+        $cookie = Cookie::create('foo', 'bar');
 
         $this->assertSame('/', $cookie->getPath(), '->getPath() returns / as the default path');
     }
 
     public function testGetExpiresTime()
     {
-        $cookie = new Cookie('foo', 'bar');
+        $cookie = Cookie::create('foo', 'bar');
 
         $this->assertEquals(0, $cookie->getExpiresTime(), '->getExpiresTime() returns the default expire date');
 
-        $cookie = new Cookie('foo', 'bar', $expire = time() + 3600);
+        $cookie = Cookie::create('foo', 'bar', $expire = time() + 3600);
 
         $this->assertEquals($expire, $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date');
     }
 
     public function testGetExpiresTimeIsCastToInt()
     {
-        $cookie = new Cookie('foo', 'bar', 3600.9);
+        $cookie = Cookie::create('foo', 'bar', 3600.9);
 
         $this->assertSame(3600, $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date as an integer');
     }
@@ -99,18 +110,15 @@ class CookieTest extends TestCase
     public function testConstructorWithDateTime()
     {
         $expire = new \DateTime();
-        $cookie = new Cookie('foo', 'bar', $expire);
+        $cookie = Cookie::create('foo', 'bar', $expire);
 
         $this->assertEquals($expire->format('U'), $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date');
     }
 
-    /**
-     * @requires PHP 5.5
-     */
     public function testConstructorWithDateTimeImmutable()
     {
         $expire = new \DateTimeImmutable();
-        $cookie = new Cookie('foo', 'bar', $expire);
+        $cookie = Cookie::create('foo', 'bar', $expire);
 
         $this->assertEquals($expire->format('U'), $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date');
     }
@@ -118,104 +126,107 @@ class CookieTest extends TestCase
     public function testGetExpiresTimeWithStringValue()
     {
         $value = '+1 day';
-        $cookie = new Cookie('foo', 'bar', $value);
+        $cookie = Cookie::create('foo', 'bar', $value);
         $expire = strtotime($value);
 
-        $this->assertEquals($expire, $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date', 1);
+        $this->assertEqualsWithDelta($expire, $cookie->getExpiresTime(), 1, '->getExpiresTime() returns the expire date');
     }
 
     public function testGetDomain()
     {
-        $cookie = new Cookie('foo', 'bar', 0, '/', '.myfoodomain.com');
+        $cookie = Cookie::create('foo', 'bar', 0, '/', '.myfoodomain.com');
 
         $this->assertEquals('.myfoodomain.com', $cookie->getDomain(), '->getDomain() returns the domain name on which the cookie is valid');
     }
 
     public function testIsSecure()
     {
-        $cookie = new Cookie('foo', 'bar', 0, '/', '.myfoodomain.com', true);
+        $cookie = Cookie::create('foo', 'bar', 0, '/', '.myfoodomain.com', true);
 
         $this->assertTrue($cookie->isSecure(), '->isSecure() returns whether the cookie is transmitted over HTTPS');
     }
 
     public function testIsHttpOnly()
     {
-        $cookie = new Cookie('foo', 'bar', 0, '/', '.myfoodomain.com', false, true);
+        $cookie = Cookie::create('foo', 'bar', 0, '/', '.myfoodomain.com', false, true);
 
         $this->assertTrue($cookie->isHttpOnly(), '->isHttpOnly() returns whether the cookie is only transmitted over HTTP');
     }
 
     public function testCookieIsNotCleared()
     {
-        $cookie = new Cookie('foo', 'bar', time() + 3600 * 24);
+        $cookie = Cookie::create('foo', 'bar', time() + 3600 * 24);
 
         $this->assertFalse($cookie->isCleared(), '->isCleared() returns false if the cookie did not expire yet');
     }
 
     public function testCookieIsCleared()
     {
-        $cookie = new Cookie('foo', 'bar', time() - 20);
+        $cookie = Cookie::create('foo', 'bar', time() - 20);
 
         $this->assertTrue($cookie->isCleared(), '->isCleared() returns true if the cookie has expired');
 
-        $cookie = new Cookie('foo', 'bar');
+        $cookie = Cookie::create('foo', 'bar');
 
         $this->assertFalse($cookie->isCleared());
 
-        $cookie = new Cookie('foo', 'bar', 0);
+        $cookie = Cookie::create('foo', 'bar');
 
         $this->assertFalse($cookie->isCleared());
 
-        $cookie = new Cookie('foo', 'bar', -1);
+        $cookie = Cookie::create('foo', 'bar', -1);
 
         $this->assertFalse($cookie->isCleared());
     }
 
     public function testToString()
     {
-        $cookie = new Cookie('foo', 'bar', $expire = strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true);
+        $cookie = Cookie::create('foo', 'bar', $expire = strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true, true, false, null);
         $this->assertEquals('foo=bar; expires=Fri, 20-May-2011 15:25:52 GMT; Max-Age=0; path=/; domain=.myfoodomain.com; secure; httponly', (string) $cookie, '->__toString() returns string representation of the cookie');
 
-        $cookie = new Cookie('foo', 'bar with white spaces', strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true);
+        $cookie = Cookie::create('foo', 'bar with white spaces', strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true, true, false, null);
         $this->assertEquals('foo=bar%20with%20white%20spaces; expires=Fri, 20-May-2011 15:25:52 GMT; Max-Age=0; path=/; domain=.myfoodomain.com; secure; httponly', (string) $cookie, '->__toString() encodes the value of the cookie according to RFC 3986 (white space = %20)');
 
-        $cookie = new Cookie('foo', null, 1, '/admin/', '.myfoodomain.com');
+        $cookie = Cookie::create('foo', null, 1, '/admin/', '.myfoodomain.com', false, true, false, null);
         $this->assertEquals('foo=deleted; expires='.gmdate('D, d-M-Y H:i:s T', $expire = time() - 31536001).'; Max-Age=0; path=/admin/; domain=.myfoodomain.com; httponly', (string) $cookie, '->__toString() returns string representation of a cleared cookie if value is NULL');
 
-        $cookie = new Cookie('foo', 'bar', 0, '/', '');
-        $this->assertEquals('foo=bar; path=/; httponly', (string) $cookie);
+        $cookie = Cookie::create('foo', 'bar');
+        $this->assertEquals('foo=bar; path=/; httponly; samesite=lax', (string) $cookie);
     }
 
     public function testRawCookie()
     {
-        $cookie = new Cookie('foo', 'b a r', 0, '/', null, false, false);
+        $cookie = Cookie::create('foo', 'b a r', 0, '/', null, false, false, false, null);
         $this->assertFalse($cookie->isRaw());
         $this->assertEquals('foo=b%20a%20r; path=/', (string) $cookie);
 
-        $cookie = new Cookie('foo', 'b+a+r', 0, '/', null, false, false, true);
+        $cookie = Cookie::create('foo', 'b+a+r', 0, '/', null, false, false, true, null);
         $this->assertTrue($cookie->isRaw());
         $this->assertEquals('foo=b+a+r; path=/', (string) $cookie);
     }
 
     public function testGetMaxAge()
     {
-        $cookie = new Cookie('foo', 'bar');
+        $cookie = Cookie::create('foo', 'bar');
         $this->assertEquals(0, $cookie->getMaxAge());
 
-        $cookie = new Cookie('foo', 'bar', $expire = time() + 100);
+        $cookie = Cookie::create('foo', 'bar', $expire = time() + 100);
         $this->assertEquals($expire - time(), $cookie->getMaxAge());
 
-        $cookie = new Cookie('foo', 'bar', $expire = time() - 100);
+        $cookie = Cookie::create('foo', 'bar', $expire = time() - 100);
         $this->assertEquals(0, $cookie->getMaxAge());
     }
 
     public function testFromString()
     {
         $cookie = Cookie::fromString('foo=bar; expires=Fri, 20-May-2011 15:25:52 GMT; path=/; domain=.myfoodomain.com; secure; httponly');
-        $this->assertEquals(new Cookie('foo', 'bar', strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true, true, true), $cookie);
+        $this->assertEquals(Cookie::create('foo', 'bar', strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true, true, true, null), $cookie);
 
         $cookie = Cookie::fromString('foo=bar', true);
-        $this->assertEquals(new Cookie('foo', 'bar', 0, '/', null, false, false), $cookie);
+        $this->assertEquals(Cookie::create('foo', 'bar', 0, '/', null, false, false, false, null), $cookie);
+
+        $cookie = Cookie::fromString('foo', true);
+        $this->assertEquals(Cookie::create('foo', null, 0, '/', null, false, false, false, null), $cookie);
     }
 
     public function testFromStringWithHttpOnly()
@@ -227,9 +238,27 @@ class CookieTest extends TestCase
         $this->assertFalse($cookie->isHttpOnly());
     }
 
-    public function testSameSiteAttributeIsCaseInsensitive()
+    public function testSameSiteAttribute()
     {
         $cookie = new Cookie('foo', 'bar', 0, '/', null, false, true, false, 'Lax');
         $this->assertEquals('lax', $cookie->getSameSite());
+
+        $cookie = new Cookie('foo', 'bar', 0, '/', null, false, true, false, '');
+        $this->assertNull($cookie->getSameSite());
+    }
+
+    public function testSetSecureDefault()
+    {
+        $cookie = Cookie::create('foo', 'bar');
+
+        $this->assertFalse($cookie->isSecure());
+
+        $cookie->setSecureDefault(true);
+
+        $this->assertTrue($cookie->isSecure());
+
+        $cookie->setSecureDefault(false);
+
+        $this->assertFalse($cookie->isSecure());
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/ExpressionRequestMatcherTest.php b/vendor/symfony/http-foundation/Tests/ExpressionRequestMatcherTest.php
index 2afdade..8a38932 100644
--- a/vendor/symfony/http-foundation/Tests/ExpressionRequestMatcherTest.php
+++ b/vendor/symfony/http-foundation/Tests/ExpressionRequestMatcherTest.php
@@ -18,11 +18,9 @@ use Symfony\Component\HttpFoundation\Request;
 
 class ExpressionRequestMatcherTest extends TestCase
 {
-    /**
-     * @expectedException \LogicException
-     */
     public function testWhenNoExpressionIsSet()
     {
+        $this->expectException('LogicException');
         $expressionRequestMatcher = new ExpressionRequestMatcher();
         $expressionRequestMatcher->matches(new Request());
     }
diff --git a/vendor/symfony/http-foundation/Tests/File/FileTest.php b/vendor/symfony/http-foundation/Tests/File/FileTest.php
index caf2029..2ef259e 100644
--- a/vendor/symfony/http-foundation/Tests/File/FileTest.php
+++ b/vendor/symfony/http-foundation/Tests/File/FileTest.php
@@ -13,8 +13,10 @@ namespace Symfony\Component\HttpFoundation\Tests\File;
 
 use PHPUnit\Framework\TestCase;
 use Symfony\Component\HttpFoundation\File\File;
-use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
 
+/**
+ * @requires extension fileinfo
+ */
 class FileTest extends TestCase
 {
     protected $file;
@@ -22,49 +24,24 @@ class FileTest extends TestCase
     public function testGetMimeTypeUsesMimeTypeGuessers()
     {
         $file = new File(__DIR__.'/Fixtures/test.gif');
-        $guesser = $this->createMockGuesser($file->getPathname(), 'image/gif');
-
-        MimeTypeGuesser::getInstance()->register($guesser);
-
         $this->assertEquals('image/gif', $file->getMimeType());
     }
 
     public function testGuessExtensionWithoutGuesser()
     {
         $file = new File(__DIR__.'/Fixtures/directory/.empty');
-
         $this->assertNull($file->guessExtension());
     }
 
     public function testGuessExtensionIsBasedOnMimeType()
     {
         $file = new File(__DIR__.'/Fixtures/test');
-        $guesser = $this->createMockGuesser($file->getPathname(), 'image/gif');
-
-        MimeTypeGuesser::getInstance()->register($guesser);
-
         $this->assertEquals('gif', $file->guessExtension());
     }
 
-    /**
-     * @requires extension fileinfo
-     */
-    public function testGuessExtensionWithReset()
-    {
-        $file = new File(__DIR__.'/Fixtures/other-file.example');
-        $guesser = $this->createMockGuesser($file->getPathname(), 'image/gif');
-        MimeTypeGuesser::getInstance()->register($guesser);
-
-        $this->assertEquals('gif', $file->guessExtension());
-
-        MimeTypeGuesser::reset();
-
-        $this->assertNull($file->guessExtension());
-    }
-
     public function testConstructWhenFileNotExists()
     {
-        $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException');
+        $this->expectException('Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException');
 
         new File(__DIR__.'/Fixtures/not_here');
     }
@@ -164,17 +141,4 @@ class FileTest extends TestCase
         @unlink($targetPath);
         @rmdir($targetDir);
     }
-
-    protected function createMockGuesser($path, $mimeType)
-    {
-        $guesser = $this->getMockBuilder('Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface')->getMock();
-        $guesser
-            ->expects($this->once())
-            ->method('guess')
-            ->with($this->equalTo($path))
-            ->willReturn($mimeType)
-        ;
-
-        return $guesser;
-    }
 }
diff --git a/vendor/symfony/http-foundation/Tests/File/MimeType/MimeTypeTest.php b/vendor/symfony/http-foundation/Tests/File/MimeType/MimeTypeTest.php
index bb88807..c566db7 100644
--- a/vendor/symfony/http-foundation/Tests/File/MimeType/MimeTypeTest.php
+++ b/vendor/symfony/http-foundation/Tests/File/MimeType/MimeTypeTest.php
@@ -17,10 +17,20 @@ use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
 
 /**
  * @requires extension fileinfo
+ * @group legacy
  */
 class MimeTypeTest extends TestCase
 {
-    protected $path;
+    public function testGuessWithLeadingDash()
+    {
+        $cwd = getcwd();
+        chdir(__DIR__.'/../Fixtures');
+        try {
+            $this->assertEquals('image/gif', MimeTypeGuesser::getInstance()->guess('-test'));
+        } finally {
+            chdir($cwd);
+        }
+    }
 
     public function testGuessImageWithoutExtension()
     {
@@ -29,7 +39,7 @@ class MimeTypeTest extends TestCase
 
     public function testGuessImageWithDirectory()
     {
-        $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException');
+        $this->expectException('Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException');
 
         MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/directory');
     }
@@ -53,7 +63,7 @@ class MimeTypeTest extends TestCase
 
     public function testGuessWithIncorrectPath()
     {
-        $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException');
+        $this->expectException('Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException');
         MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/not_here');
     }
 
@@ -72,14 +82,14 @@ class MimeTypeTest extends TestCase
         @chmod($path, 0333);
 
         if ('0333' == substr(sprintf('%o', fileperms($path)), -4)) {
-            $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException');
+            $this->expectException('Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException');
             MimeTypeGuesser::getInstance()->guess($path);
         } else {
             $this->markTestSkipped('Can not verify chmod operations, change of file permissions failed');
         }
     }
 
-    public static function tearDownAfterClass()
+    public static function tearDownAfterClass(): void
     {
         $path = __DIR__.'/../Fixtures/to_delete';
         if (file_exists($path)) {
diff --git a/vendor/symfony/http-foundation/Tests/File/UploadedFileTest.php b/vendor/symfony/http-foundation/Tests/File/UploadedFileTest.php
index 5a37cda..17d3195 100644
--- a/vendor/symfony/http-foundation/Tests/File/UploadedFileTest.php
+++ b/vendor/symfony/http-foundation/Tests/File/UploadedFileTest.php
@@ -12,11 +12,19 @@
 namespace Symfony\Component\HttpFoundation\Tests\File;
 
 use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\File\Exception\CannotWriteFileException;
+use Symfony\Component\HttpFoundation\File\Exception\ExtensionFileException;
+use Symfony\Component\HttpFoundation\File\Exception\FileException;
+use Symfony\Component\HttpFoundation\File\Exception\FormSizeFileException;
+use Symfony\Component\HttpFoundation\File\Exception\IniSizeFileException;
+use Symfony\Component\HttpFoundation\File\Exception\NoFileException;
+use Symfony\Component\HttpFoundation\File\Exception\NoTmpDirFileException;
+use Symfony\Component\HttpFoundation\File\Exception\PartialFileException;
 use Symfony\Component\HttpFoundation\File\UploadedFile;
 
 class UploadedFileTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         if (!ini_get('file_uploads')) {
             $this->markTestSkipped('file_uploads is disabled in php.ini');
@@ -25,7 +33,7 @@ class UploadedFileTest extends TestCase
 
     public function testConstructWhenFileNotExists()
     {
-        $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException');
+        $this->expectException('Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException');
 
         new UploadedFile(
             __DIR__.'/Fixtures/not_here',
@@ -40,7 +48,6 @@ class UploadedFileTest extends TestCase
             __DIR__.'/Fixtures/test.gif',
             'original.gif',
             null,
-            filesize(__DIR__.'/Fixtures/test.gif'),
             UPLOAD_ERR_OK
         );
 
@@ -57,7 +64,6 @@ class UploadedFileTest extends TestCase
             __DIR__.'/Fixtures/.unknownextension',
             'original.gif',
             null,
-            filesize(__DIR__.'/Fixtures/.unknownextension'),
             UPLOAD_ERR_OK
         );
 
@@ -70,7 +76,6 @@ class UploadedFileTest extends TestCase
             __DIR__.'/Fixtures/test.gif',
             'original.gif',
             'image/gif',
-            filesize(__DIR__.'/Fixtures/test.gif'),
             null
         );
 
@@ -83,7 +88,6 @@ class UploadedFileTest extends TestCase
             __DIR__.'/Fixtures/test.gif',
             'original.gif',
             'image/jpeg',
-            filesize(__DIR__.'/Fixtures/test.gif'),
             null
         );
 
@@ -96,7 +100,6 @@ class UploadedFileTest extends TestCase
             __DIR__.'/Fixtures/case-sensitive-mime-type.xlsm',
             'test.xlsm',
             'application/vnd.ms-excel.sheet.macroEnabled.12',
-            filesize(__DIR__.'/Fixtures/case-sensitive-mime-type.xlsm'),
             null
         );
 
@@ -109,7 +112,6 @@ class UploadedFileTest extends TestCase
             __DIR__.'/Fixtures/test.gif',
             'original.gif',
             'image/gif',
-            filesize(__DIR__.'/Fixtures/test.gif'),
             null
         );
 
@@ -122,7 +124,6 @@ class UploadedFileTest extends TestCase
             __DIR__.'/Fixtures/test.gif',
             'original.gif',
             'image/gif',
-            filesize(__DIR__.'/Fixtures/test.gif'),
             null
         );
 
@@ -135,27 +136,71 @@ class UploadedFileTest extends TestCase
             __DIR__.'/Fixtures/test.gif',
             'original.gif',
             'image/gif',
-            filesize(__DIR__.'/Fixtures/test.gif'),
             null
         );
 
         $this->assertEquals('gif', $file->getClientOriginalExtension());
     }
 
-    /**
-     * @expectedException \Symfony\Component\HttpFoundation\File\Exception\FileException
-     */
     public function testMoveLocalFileIsNotAllowed()
     {
+        $this->expectException('Symfony\Component\HttpFoundation\File\Exception\FileException');
         $file = new UploadedFile(
             __DIR__.'/Fixtures/test.gif',
             'original.gif',
             'image/gif',
-            filesize(__DIR__.'/Fixtures/test.gif'),
             UPLOAD_ERR_OK
         );
 
-        $movedFile = $file->move(__DIR__.'/Fixtures/directory');
+        $file->move(__DIR__.'/Fixtures/directory');
+    }
+
+    public function failedUploadedFile()
+    {
+        foreach ([UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_FORM_SIZE, UPLOAD_ERR_PARTIAL, UPLOAD_ERR_NO_FILE, UPLOAD_ERR_CANT_WRITE, UPLOAD_ERR_NO_TMP_DIR, UPLOAD_ERR_EXTENSION, -1] as $error) {
+            yield [new UploadedFile(
+                __DIR__.'/Fixtures/test.gif',
+                'original.gif',
+                'image/gif',
+                $error
+            )];
+        }
+    }
+
+    /**
+     * @dataProvider failedUploadedFile
+     */
+    public function testMoveFailed(UploadedFile $file)
+    {
+        switch ($file->getError()) {
+            case UPLOAD_ERR_INI_SIZE:
+                $exceptionClass = IniSizeFileException::class;
+                break;
+            case UPLOAD_ERR_FORM_SIZE:
+                $exceptionClass = FormSizeFileException::class;
+                break;
+            case UPLOAD_ERR_PARTIAL:
+                $exceptionClass = PartialFileException::class;
+                break;
+            case UPLOAD_ERR_NO_FILE:
+                $exceptionClass = NoFileException::class;
+                break;
+            case UPLOAD_ERR_CANT_WRITE:
+                $exceptionClass = CannotWriteFileException::class;
+                break;
+            case UPLOAD_ERR_NO_TMP_DIR:
+                $exceptionClass = NoTmpDirFileException::class;
+                break;
+            case UPLOAD_ERR_EXTENSION:
+                $exceptionClass = ExtensionFileException::class;
+                break;
+            default:
+                $exceptionClass = FileException::class;
+        }
+
+        $this->expectException($exceptionClass);
+
+        $file->move(__DIR__.'/Fixtures/directory');
     }
 
     public function testMoveLocalFileIsAllowedInTestMode()
@@ -171,7 +216,6 @@ class UploadedFileTest extends TestCase
             $path,
             'original.gif',
             'image/gif',
-            filesize($path),
             UPLOAD_ERR_OK,
             true
         );
@@ -190,9 +234,7 @@ class UploadedFileTest extends TestCase
         $file = new UploadedFile(
             __DIR__.'/Fixtures/test.gif',
             '../../original.gif',
-            'image/gif',
-            filesize(__DIR__.'/Fixtures/test.gif'),
-            null
+            'image/gif'
         );
 
         $this->assertEquals('original.gif', $file->getClientOriginalName());
@@ -203,9 +245,7 @@ class UploadedFileTest extends TestCase
         $file = new UploadedFile(
             __DIR__.'/Fixtures/test.gif',
             'original.gif',
-            'image/gif',
-            filesize(__DIR__.'/Fixtures/test.gif'),
-            null
+            'image/gif'
         );
 
         $this->assertEquals(filesize(__DIR__.'/Fixtures/test.gif'), $file->getSize());
@@ -219,12 +259,45 @@ class UploadedFileTest extends TestCase
         $this->assertEquals(filesize(__DIR__.'/Fixtures/test'), $file->getSize());
     }
 
-    public function testGetExtension()
+    /**
+     * @group legacy
+     * @expectedDeprecation Passing a size as 4th argument to the constructor of "Symfony\Component\HttpFoundation\File\UploadedFile" is deprecated since Symfony 4.1.
+     */
+    public function testConstructDeprecatedSize()
     {
         $file = new UploadedFile(
             __DIR__.'/Fixtures/test.gif',
             'original.gif',
-            null
+            'image/gif',
+            filesize(__DIR__.'/Fixtures/test.gif'),
+            UPLOAD_ERR_OK,
+            false
+        );
+
+        $this->assertEquals(filesize(__DIR__.'/Fixtures/test.gif'), $file->getSize());
+    }
+
+    /**
+     * @group legacy
+     * @expectedDeprecation Passing a size as 4th argument to the constructor of "Symfony\Component\HttpFoundation\File\UploadedFile" is deprecated since Symfony 4.1.
+     */
+    public function testConstructDeprecatedSizeWhenPassingOnlyThe4Needed()
+    {
+        $file = new UploadedFile(
+            __DIR__.'/Fixtures/test.gif',
+            'original.gif',
+            'image/gif',
+            filesize(__DIR__.'/Fixtures/test.gif')
+        );
+
+        $this->assertEquals(filesize(__DIR__.'/Fixtures/test.gif'), $file->getSize());
+    }
+
+    public function testGetExtension()
+    {
+        $file = new UploadedFile(
+            __DIR__.'/Fixtures/test.gif',
+            'original.gif'
         );
 
         $this->assertEquals('gif', $file->getExtension());
@@ -236,7 +309,6 @@ class UploadedFileTest extends TestCase
             __DIR__.'/Fixtures/test.gif',
             'original.gif',
             null,
-            filesize(__DIR__.'/Fixtures/test.gif'),
             UPLOAD_ERR_OK,
             true
         );
@@ -253,7 +325,6 @@ class UploadedFileTest extends TestCase
             __DIR__.'/Fixtures/test.gif',
             'original.gif',
             null,
-            filesize(__DIR__.'/Fixtures/test.gif'),
             $error
         );
 
@@ -277,10 +348,23 @@ class UploadedFileTest extends TestCase
             __DIR__.'/Fixtures/test.gif',
             'original.gif',
             null,
-            filesize(__DIR__.'/Fixtures/test.gif'),
             UPLOAD_ERR_OK
         );
 
         $this->assertFalse($file->isValid());
     }
+
+    public function testGetMaxFilesize()
+    {
+        $size = UploadedFile::getMaxFilesize();
+
+        $this->assertIsInt($size);
+        $this->assertGreaterThan(0, $size);
+
+        if (0 === (int) ini_get('post_max_size') && 0 === (int) ini_get('upload_max_filesize')) {
+            $this->assertSame(PHP_INT_MAX, $size);
+        } else {
+            $this->assertLessThan(PHP_INT_MAX, $size);
+        }
+    }
 }
diff --git a/vendor/symfony/http-foundation/Tests/FileBagTest.php b/vendor/symfony/http-foundation/Tests/FileBagTest.php
index 0b6d660..bde6641 100644
--- a/vendor/symfony/http-foundation/Tests/FileBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/FileBagTest.php
@@ -23,25 +23,23 @@ use Symfony\Component\HttpFoundation\FileBag;
  */
 class FileBagTest extends TestCase
 {
-    /**
-     * @expectedException \InvalidArgumentException
-     */
     public function testFileMustBeAnArrayOrUploadedFile()
     {
+        $this->expectException('InvalidArgumentException');
         new FileBag(['file' => 'foo']);
     }
 
     public function testShouldConvertsUploadedFiles()
     {
         $tmpFile = $this->createTempFile();
-        $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0);
+        $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain');
 
         $bag = new FileBag(['file' => [
             'name' => basename($tmpFile),
             'type' => 'text/plain',
             'tmp_name' => $tmpFile,
             'error' => 0,
-            'size' => 100,
+            'size' => null,
         ]]);
 
         $this->assertEquals($file, $bag->get('file'));
@@ -89,7 +87,7 @@ class FileBagTest extends TestCase
     public function testShouldConvertUploadedFilesWithPhpBug()
     {
         $tmpFile = $this->createTempFile();
-        $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0);
+        $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain');
 
         $bag = new FileBag([
             'child' => [
@@ -106,7 +104,7 @@ class FileBagTest extends TestCase
                     'file' => 0,
                 ],
                 'size' => [
-                    'file' => 100,
+                    'file' => null,
                 ],
             ],
         ]);
@@ -118,7 +116,7 @@ class FileBagTest extends TestCase
     public function testShouldConvertNestedUploadedFilesWithPhpBug()
     {
         $tmpFile = $this->createTempFile();
-        $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0);
+        $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain');
 
         $bag = new FileBag([
             'child' => [
@@ -135,7 +133,7 @@ class FileBagTest extends TestCase
                     'sub' => ['file' => 0],
                 ],
                 'size' => [
-                    'sub' => ['file' => 100],
+                    'sub' => ['file' => null],
                 ],
             ],
         ]);
@@ -147,7 +145,7 @@ class FileBagTest extends TestCase
     public function testShouldNotConvertNestedUploadedFiles()
     {
         $tmpFile = $this->createTempFile();
-        $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0);
+        $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain');
         $bag = new FileBag(['image' => ['file' => $file]]);
 
         $files = $bag->all();
@@ -156,15 +154,18 @@ class FileBagTest extends TestCase
 
     protected function createTempFile()
     {
-        return tempnam(sys_get_temp_dir().'/form_test', 'FormTest');
+        $tempFile = tempnam(sys_get_temp_dir().'/form_test', 'FormTest');
+        file_put_contents($tempFile, '1');
+
+        return $tempFile;
     }
 
-    protected function setUp()
+    protected function setUp(): void
     {
         mkdir(sys_get_temp_dir().'/form_test', 0777, true);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         foreach (glob(sys_get_temp_dir().'/form_test/*') as $file) {
             unlink($file);
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.php
index 8775a5c..e18ce52 100644
--- a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.php
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.php
@@ -4,7 +4,7 @@ use Symfony\Component\HttpFoundation\Cookie;
 
 $r = require __DIR__.'/common.inc';
 
-$r->headers->setCookie(new Cookie('foo', 'bar', 253402310800, '', null, false, false));
+$r->headers->setCookie(new Cookie('foo', 'bar', 253402310800, '', null, false, false, false, null));
 $r->sendHeaders();
 
 setcookie('foo2', 'bar', 253402310800, '/');
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.php
index 2ca5b59..00c022d 100644
--- a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.php
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.php
@@ -6,7 +6,7 @@ $r = require __DIR__.'/common.inc';
 
 $str = '?*():@&+$/%#[]';
 
-$r->headers->setCookie(new Cookie($str, $str, 0, '/', null, false, false, true));
+$r->headers->setCookie(new Cookie($str, $str, 0, '/', null, false, false, true, null));
 $r->sendHeaders();
 
 setrawcookie($str, $str, 0, '/', null, false, false);
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.expected b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.expected
index 14e44a3..17a9efc 100644
--- a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.expected
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.expected
@@ -4,7 +4,8 @@ Array
     [0] => Content-Type: text/plain; charset=utf-8
     [1] => Cache-Control: no-cache, private
     [2] => Date: Sat, 12 Nov 1955 20:04:00 GMT
-    [3] => Set-Cookie: ?*():@&+$/%#[]=%3F%2A%28%29%3A%40%26%2B%24%2F%25%23%5B%5D; path=/
+    [3] => Set-Cookie: %3D%2C%3B%20%09%0D%0A%0B%0C=%3D%2C%3B%20%09%0D%0A%0B%0C; path=/
     [4] => Set-Cookie: ?*():@&+$/%#[]=%3F%2A%28%29%3A%40%26%2B%24%2F%25%23%5B%5D; path=/
+    [5] => Set-Cookie: ?*():@&+$/%#[]=%3F%2A%28%29%3A%40%26%2B%24%2F%25%23%5B%5D; path=/
 )
 shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.php
index 05b9af3..9ffb0df 100644
--- a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.php
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.php
@@ -4,9 +4,12 @@ use Symfony\Component\HttpFoundation\Cookie;
 
 $r = require __DIR__.'/common.inc';
 
-$str = '?*():@&+$/%#[]';
+$str1 = "=,; \t\r\n\v\f";
+$r->headers->setCookie(new Cookie($str1, $str1, 0, '', null, false, false, false, null));
 
-$r->headers->setCookie(new Cookie($str, $str, 0, '', null, false, false));
+$str2 = '?*():@&+$/%#[]';
+
+$r->headers->setCookie(new Cookie($str2, $str2, 0, '', null, false, false, false, null));
 $r->sendHeaders();
 
-setcookie($str, $str, 0, '/');
+setcookie($str2, $str2, 0, '/');
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.php
index 3fe1571..3acf860 100644
--- a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.php
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.php
@@ -5,7 +5,7 @@ use Symfony\Component\HttpFoundation\Cookie;
 $r = require __DIR__.'/common.inc';
 
 try {
-    $r->headers->setCookie(new Cookie('Hello + world', 'hodor'));
+    $r->headers->setCookie(new Cookie('Hello + world', 'hodor', 0, null, null, null, false, true));
 } catch (\InvalidArgumentException $e) {
     echo $e->getMessage();
 }
diff --git a/vendor/symfony/http-foundation/Tests/HeaderBagTest.php b/vendor/symfony/http-foundation/Tests/HeaderBagTest.php
index 6c4915f..cabe038 100644
--- a/vendor/symfony/http-foundation/Tests/HeaderBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/HeaderBagTest.php
@@ -48,13 +48,18 @@ class HeaderBagTest extends TestCase
         $this->assertInstanceOf('DateTime', $headerDate);
     }
 
-    /**
-     * @expectedException \RuntimeException
-     */
+    public function testGetDateNull()
+    {
+        $bag = new HeaderBag(['foo' => null]);
+        $headerDate = $bag->getDate('foo');
+        $this->assertNull($headerDate);
+    }
+
     public function testGetDateException()
     {
+        $this->expectException('RuntimeException');
         $bag = new HeaderBag(['foo' => 'Tue']);
-        $headerDate = $bag->getDate('foo');
+        $bag->getDate('foo');
     }
 
     public function testGetCacheControlHeader()
@@ -98,6 +103,9 @@ class HeaderBagTest extends TestCase
         $bag->set('foo', 'bor', false);
         $this->assertEquals('bar', $bag->get('foo'), '->get return first value');
         $this->assertEquals(['bar', 'bor'], $bag->get('foo', 'nope', false), '->get return all values as array');
+
+        $bag->set('baz', null);
+        $this->assertNull($bag->get('baz', 'nope'), '->get return null although different default value is given');
     }
 
     public function testSetAssociativeArray()
diff --git a/vendor/symfony/http-foundation/Tests/IpUtilsTest.php b/vendor/symfony/http-foundation/Tests/IpUtilsTest.php
index c7f76b5..d3b262e 100644
--- a/vendor/symfony/http-foundation/Tests/IpUtilsTest.php
+++ b/vendor/symfony/http-foundation/Tests/IpUtilsTest.php
@@ -73,11 +73,11 @@ class IpUtilsTest extends TestCase
     }
 
     /**
-     * @expectedException \RuntimeException
      * @requires extension sockets
      */
     public function testAnIpv6WithOptionDisabledIpv6()
     {
+        $this->expectException('RuntimeException');
         if (\defined('AF_INET6')) {
             $this->markTestSkipped('Only works when PHP is compiled with the option "disable-ipv6".');
         }
diff --git a/vendor/symfony/http-foundation/Tests/JsonResponseTest.php b/vendor/symfony/http-foundation/Tests/JsonResponseTest.php
index ef0346c..aa84417 100644
--- a/vendor/symfony/http-foundation/Tests/JsonResponseTest.php
+++ b/vendor/symfony/http-foundation/Tests/JsonResponseTest.php
@@ -16,15 +16,6 @@ use Symfony\Component\HttpFoundation\JsonResponse;
 
 class JsonResponseTest extends TestCase
 {
-    protected function setUp()
-    {
-        parent::setUp();
-
-        if (!\defined('HHVM_VERSION')) {
-            $this->iniSet('serialize_precision', 14);
-        }
-    }
-
     public function testConstructorEmptyCreatesJsonObject()
     {
         $response = new JsonResponse();
@@ -52,8 +43,8 @@ class JsonResponseTest extends TestCase
         $this->assertSame('0', $response->getContent());
 
         $response = new JsonResponse(0.1);
-        $this->assertEquals('0.1', $response->getContent());
-        $this->assertInternalType('string', $response->getContent());
+        $this->assertEquals(0.1, $response->getContent());
+        $this->assertIsString($response->getContent());
 
         $response = new JsonResponse(true);
         $this->assertSame('true', $response->getContent());
@@ -141,8 +132,8 @@ class JsonResponseTest extends TestCase
 
         $response = JsonResponse::create(0.1);
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response);
-        $this->assertEquals('0.1', $response->getContent());
-        $this->assertInternalType('string', $response->getContent());
+        $this->assertEquals(0.1, $response->getContent());
+        $this->assertIsString($response->getContent());
 
         $response = JsonResponse::create(true);
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response);
@@ -216,29 +207,23 @@ class JsonResponseTest extends TestCase
         $this->assertSame('{"foo":"bar"}', $response->getContent());
     }
 
-    /**
-     * @expectedException \InvalidArgumentException
-     */
     public function testSetCallbackInvalidIdentifier()
     {
+        $this->expectException('InvalidArgumentException');
         $response = new JsonResponse('foo');
         $response->setCallback('+invalid');
     }
 
-    /**
-     * @expectedException \InvalidArgumentException
-     */
     public function testSetContent()
     {
+        $this->expectException('InvalidArgumentException');
         JsonResponse::create("\xB1\x31");
     }
 
-    /**
-     * @expectedException \Exception
-     * @expectedExceptionMessage This error is expected
-     */
     public function testSetContentJsonSerializeError()
     {
+        $this->expectException('Exception');
+        $this->expectExceptionMessage('This error is expected');
         if (!interface_exists('JsonSerializable', false)) {
             $this->markTestSkipped('JsonSerializable is required.');
         }
diff --git a/vendor/symfony/http-foundation/Tests/RedirectResponseTest.php b/vendor/symfony/http-foundation/Tests/RedirectResponseTest.php
index 5f6a8ac..e1ff3bf 100644
--- a/vendor/symfony/http-foundation/Tests/RedirectResponseTest.php
+++ b/vendor/symfony/http-foundation/Tests/RedirectResponseTest.php
@@ -26,20 +26,16 @@ class RedirectResponseTest extends TestCase
         ));
     }
 
-    /**
-     * @expectedException \InvalidArgumentException
-     */
     public function testRedirectResponseConstructorNullUrl()
     {
-        $response = new RedirectResponse(null);
+        $this->expectException('InvalidArgumentException');
+        new RedirectResponse(null);
     }
 
-    /**
-     * @expectedException \InvalidArgumentException
-     */
     public function testRedirectResponseConstructorWrongStatusCode()
     {
-        $response = new RedirectResponse('foo.bar', 404);
+        $this->expectException('InvalidArgumentException');
+        new RedirectResponse('foo.bar', 404);
     }
 
     public function testGenerateLocationHeader()
@@ -65,11 +61,9 @@ class RedirectResponseTest extends TestCase
         $this->assertEquals('baz.beep', $response->getTargetUrl());
     }
 
-    /**
-     * @expectedException \InvalidArgumentException
-     */
     public function testSetTargetUrlNull()
     {
+        $this->expectException('InvalidArgumentException');
         $response = new RedirectResponse('foo.bar');
         $response->setTargetUrl(null);
     }
diff --git a/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php b/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php
index 7fb6925..57e9c3d 100644
--- a/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php
+++ b/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php
@@ -78,6 +78,21 @@ class RequestMatcherTest extends TestCase
         $this->assertSame($isMatch, $matcher->matches($request));
     }
 
+    public function testPort()
+    {
+        $matcher = new RequestMatcher();
+        $request = Request::create('', 'get', [], [], [], ['HTTP_HOST' => null, 'SERVER_PORT' => 8000]);
+
+        $matcher->matchPort(8000);
+        $this->assertTrue($matcher->matches($request));
+
+        $matcher->matchPort(9000);
+        $this->assertFalse($matcher->matches($request));
+
+        $matcher = new RequestMatcher(null, null, null, null, [], null, 8000);
+        $this->assertTrue($matcher->matches($request));
+    }
+
     public function getHostData()
     {
         return [
diff --git a/vendor/symfony/http-foundation/Tests/RequestTest.php b/vendor/symfony/http-foundation/Tests/RequestTest.php
index d266e1f..03493b5 100644
--- a/vendor/symfony/http-foundation/Tests/RequestTest.php
+++ b/vendor/symfony/http-foundation/Tests/RequestTest.php
@@ -19,7 +19,7 @@ use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
 
 class RequestTest extends TestCase
 {
-    protected function tearDown()
+    protected function tearDown(): void
     {
         Request::setTrustedProxies([], -1);
         Request::setTrustedHosts([]);
@@ -776,7 +776,7 @@ class RequestTest extends TestCase
     public function getQueryStringNormalizationData()
     {
         return [
-            ['foo', 'foo', 'works with valueless parameters'],
+            ['foo', 'foo=', 'works with valueless parameters'],
             ['foo=', 'foo=', 'includes a dangling equal sign'],
             ['bar=&foo=bar', 'bar=&foo=bar', '->works with empty parameters'],
             ['foo=bar&bar=', 'bar=&foo=bar', 'sorts keys alphabetically'],
@@ -785,18 +785,24 @@ class RequestTest extends TestCase
             // PHP also converts "+" to spaces when filling the global _GET or when using the function parse_str.
             ['baz=Foo%20Baz&bar=Foo+Bar', 'bar=Foo%20Bar&baz=Foo%20Baz', 'normalizes spaces in both encodings "%20" and "+"'],
 
-            ['foo[]=1&foo[]=2', 'foo%5B%5D=1&foo%5B%5D=2', 'allows array notation'],
-            ['foo=1&foo=2', 'foo=1&foo=2', 'allows repeated parameters'],
+            ['foo[]=1&foo[]=2', 'foo%5B0%5D=1&foo%5B1%5D=2', 'allows array notation'],
+            ['foo=1&foo=2', 'foo=2', 'merges repeated parameters'],
             ['pa%3Dram=foo%26bar%3Dbaz&test=test', 'pa%3Dram=foo%26bar%3Dbaz&test=test', 'works with encoded delimiters'],
-            ['0', '0', 'allows "0"'],
-            ['Foo Bar&Foo%20Baz', 'Foo%20Bar&Foo%20Baz', 'normalizes encoding in keys'],
+            ['0', '0=', 'allows "0"'],
+            ['Foo Bar&Foo%20Baz', 'Foo_Bar=&Foo_Baz=', 'normalizes encoding in keys'],
             ['bar=Foo Bar&baz=Foo%20Baz', 'bar=Foo%20Bar&baz=Foo%20Baz', 'normalizes encoding in values'],
-            ['foo=bar&&&test&&', 'foo=bar&test', 'removes unneeded delimiters'],
+            ['foo=bar&&&test&&', 'foo=bar&test=', 'removes unneeded delimiters'],
             ['formula=e=m*c^2', 'formula=e%3Dm%2Ac%5E2', 'correctly treats only the first "=" as delimiter and the next as value'],
 
             // Ignore pairs with empty key, even if there was a value, e.g. "=value", as such nameless values cannot be retrieved anyway.
             // PHP also does not include them when building _GET.
             ['foo=bar&=a=b&=x=y', 'foo=bar', 'removes params with empty key'],
+
+            // Don't reorder nested query string keys
+            ['foo[]=Z&foo[]=A', 'foo%5B0%5D=Z&foo%5B1%5D=A', 'keeps order of values'],
+            ['foo[Z]=B&foo[A]=B', 'foo%5BZ%5D=B&foo%5BA%5D=B', 'keeps order of keys'],
+
+            ['utf8=✓', 'utf8=%E2%9C%93', 'encodes UTF-8'],
         ];
     }
 
@@ -886,11 +892,9 @@ class RequestTest extends TestCase
         $this->assertEquals(80, $port, 'With only PROTO set and value is not recognized, getPort() defaults to 80.');
     }
 
-    /**
-     * @expectedException \RuntimeException
-     */
     public function testGetHostWithFakeHttpHostValue()
     {
+        $this->expectException('RuntimeException');
         $request = new Request();
         $request->initialize([], [], [], [], [], ['HTTP_HOST' => 'www.host.com?query=string']);
         $request->getHost();
@@ -994,7 +998,7 @@ class RequestTest extends TestCase
             [['127.0.0.1'],                              '127.0.0.1', 'for="_gazonk"',                                      ['127.0.0.1']],
             [['88.88.88.88'],                            '127.0.0.1', 'for="88.88.88.88:80"',                               ['127.0.0.1']],
             [['192.0.2.60'],                             '::1',       'for=192.0.2.60;proto=http;by=203.0.113.43',          ['::1']],
-            [['2620:0:1cfe:face:b00c::3', '192.0.2.43'], '::1',       'for=192.0.2.43, for=2620:0:1cfe:face:b00c::3',       ['::1']],
+            [['2620:0:1cfe:face:b00c::3', '192.0.2.43'], '::1',       'for=192.0.2.43, for="[2620:0:1cfe:face:b00c::3]"',   ['::1']],
             [['2001:db8:cafe::17'],                      '::1',       'for="[2001:db8:cafe::17]:4711',                      ['::1']],
         ];
     }
@@ -1025,7 +1029,7 @@ class RequestTest extends TestCase
             // forwarded for with remote IPv6 addr not trusted
             [['1620:0:1cfe:face:b00c::3'], '1620:0:1cfe:face:b00c::3', '2620:0:1cfe:face:b00c::3',  null],
             // forwarded for with remote IPv6 addr trusted
-            [['2620:0:1cfe:face:b00c::3'], '1620:0:1cfe:face:b00c::3', '2620:0:1cfe:face:b00c::3', ['1620:0:1cfe:face:b00c::3']],
+            [['2620:0:1cfe:face:b00c::3'], '1620:0:1cfe:face:b00c::3', '2620:0:1cfe:face:b00c::3',  ['1620:0:1cfe:face:b00c::3']],
             // forwarded for with remote IPv6 range trusted
             [['88.88.88.88'],              '2a01:198:603:0:396e:4789:8e99:890f', '88.88.88.88',     ['2a01:198:603:0::/65']],
 
@@ -1055,11 +1059,11 @@ class RequestTest extends TestCase
     }
 
     /**
-     * @expectedException \Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException
      * @dataProvider getClientIpsWithConflictingHeadersProvider
      */
     public function testGetClientIpsWithConflictingHeaders($httpForwarded, $httpXForwardedFor)
     {
+        $this->expectException('Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException');
         $request = new Request();
 
         $server = [
@@ -1153,7 +1157,7 @@ class RequestTest extends TestCase
     {
         $req = new Request();
         $retval = $req->getContent(true);
-        $this->assertInternalType('resource', $retval);
+        $this->assertIsResource($retval);
         $this->assertEquals('', fread($retval, 1));
         $this->assertTrue(feof($retval));
     }
@@ -1163,7 +1167,7 @@ class RequestTest extends TestCase
         $req = new Request([], [], [], [], [], [], 'MyContent');
         $resource = $req->getContent(true);
 
-        $this->assertInternalType('resource', $resource);
+        $this->assertIsResource($resource);
         $this->assertEquals('MyContent', stream_get_contents($resource));
     }
 
@@ -1178,21 +1182,6 @@ class RequestTest extends TestCase
         $this->assertEquals('My other content', $req->getContent());
     }
 
-    /**
-     * @expectedException \LogicException
-     * @dataProvider getContentCantBeCalledTwiceWithResourcesProvider
-     */
-    public function testGetContentCantBeCalledTwiceWithResources($first, $second)
-    {
-        if (\PHP_VERSION_ID >= 50600) {
-            $this->markTestSkipped('PHP >= 5.6 allows to open php://input several times.');
-        }
-
-        $req = new Request();
-        $req->getContent($first);
-        $req->getContent($second);
-    }
-
     public function getContentCantBeCalledTwiceWithResourcesProvider()
     {
         return [
@@ -1203,7 +1192,6 @@ class RequestTest extends TestCase
 
     /**
      * @dataProvider getContentCanBeCalledTwiceWithResourcesProvider
-     * @requires PHP 5.6
      */
     public function testGetContentCanBeCalledTwiceWithResources($first, $second)
     {
@@ -1551,7 +1539,6 @@ class RequestTest extends TestCase
         $request = new Request();
         $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6');
         $this->assertEquals(['zh', 'en_US', 'en'], $request->getLanguages());
-        $this->assertEquals(['zh', 'en_US', 'en'], $request->getLanguages());
 
         $request = new Request();
         $request->headers->set('Accept-language', 'zh, en-us; q=0.6, en; q=0.8');
@@ -1613,6 +1600,15 @@ class RequestTest extends TestCase
         $this->assertObjectHasAttribute('attributeName', $session);
     }
 
+    /**
+     * @group legacy
+     * @expectedDeprecation Calling "Symfony\Component\HttpFoundation\Request::getSession()" when no session has been set is deprecated since Symfony 4.1 and will throw an exception in 5.0. Use "hasSession()" instead.
+     */
+    public function testGetSessionNullable()
+    {
+        (new Request())->getSession();
+    }
+
     public function testHasPreviousSession()
     {
         $request = new Request();
@@ -1633,14 +1629,14 @@ class RequestTest extends TestCase
 
         $asString = (string) $request;
 
-        $this->assertContains('Accept-Language: zh, en-us; q=0.8, en; q=0.6', $asString);
-        $this->assertContains('Cookie: Foo=Bar', $asString);
+        $this->assertStringContainsString('Accept-Language: zh, en-us; q=0.8, en; q=0.6', $asString);
+        $this->assertStringContainsString('Cookie: Foo=Bar', $asString);
 
         $request->cookies->set('Another', 'Cookie');
 
         $asString = (string) $request;
 
-        $this->assertContains('Cookie: Foo=Bar; Another=Cookie', $asString);
+        $this->assertStringContainsString('Cookie: Foo=Bar; Another=Cookie', $asString);
     }
 
     public function testIsMethod()
@@ -1870,53 +1866,6 @@ class RequestTest extends TestCase
         $this->assertTrue($request->isSecure());
     }
 
-    /**
-     * @group legacy
-     * @expectedDeprecation The "Symfony\Component\HttpFoundation\Request::setTrustedHeaderName()" method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the $trustedHeaderSet argument of the Request::setTrustedProxies() method instead.
-     */
-    public function testLegacyTrustedProxies()
-    {
-        $request = Request::create('http://example.com/');
-        $request->server->set('REMOTE_ADDR', '3.3.3.3');
-        $request->headers->set('X_FORWARDED_FOR', '1.1.1.1, 2.2.2.2');
-        $request->headers->set('X_FORWARDED_HOST', 'foo.example.com, real.example.com:8080');
-        $request->headers->set('X_FORWARDED_PROTO', 'https');
-        $request->headers->set('X_FORWARDED_PORT', 443);
-        $request->headers->set('X_MY_FOR', '3.3.3.3, 4.4.4.4');
-        $request->headers->set('X_MY_HOST', 'my.example.com');
-        $request->headers->set('X_MY_PROTO', 'http');
-        $request->headers->set('X_MY_PORT', 81);
-
-        Request::setTrustedProxies(['3.3.3.3', '2.2.2.2'], Request::HEADER_X_FORWARDED_ALL);
-
-        // custom header names
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, 'X_MY_FOR');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, 'X_MY_HOST');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, 'X_MY_PORT');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, 'X_MY_PROTO');
-        $this->assertEquals('4.4.4.4', $request->getClientIp());
-        $this->assertEquals('my.example.com', $request->getHost());
-        $this->assertEquals(81, $request->getPort());
-        $this->assertFalse($request->isSecure());
-
-        // disabling via empty header names
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, null);
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, null);
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, null);
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, null);
-        $this->assertEquals('3.3.3.3', $request->getClientIp());
-        $this->assertEquals('example.com', $request->getHost());
-        $this->assertEquals(80, $request->getPort());
-        $this->assertFalse($request->isSecure());
-
-        //reset
-        Request::setTrustedHeaderName(Request::HEADER_FORWARDED, 'FORWARDED');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, 'X_FORWARDED_FOR');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, 'X_FORWARDED_HOST');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, 'X_FORWARDED_PORT');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, 'X_FORWARDED_PROTO');
-    }
-
     public function testTrustedProxiesForwarded()
     {
         $request = Request::create('http://example.com/');
@@ -1967,26 +1916,6 @@ class RequestTest extends TestCase
     }
 
     /**
-     * @group legacy
-     * @expectedException \InvalidArgumentException
-     */
-    public function testSetTrustedProxiesInvalidHeaderName()
-    {
-        Request::create('http://example.com/');
-        Request::setTrustedHeaderName('bogus name', 'X_MY_FOR');
-    }
-
-    /**
-     * @group legacy
-     * @expectedException \InvalidArgumentException
-     */
-    public function testGetTrustedProxiesInvalidHeaderName()
-    {
-        Request::create('http://example.com/');
-        Request::getTrustedHeaderName('bogus name');
-    }
-
-    /**
      * @dataProvider iisRequestUriProvider
      */
     public function testIISRequestUri($headers, $server, $expectedRequestUri)
@@ -2118,12 +2047,8 @@ class RequestTest extends TestCase
                 $this->assertSame($expectedPort, $request->getPort());
             }
         } else {
-            if (method_exists($this, 'expectException')) {
-                $this->expectException(SuspiciousOperationException::class);
-                $this->expectExceptionMessage('Invalid Host');
-            } else {
-                $this->setExpectedException(SuspiciousOperationException::class, 'Invalid Host');
-            }
+            $this->expectException(SuspiciousOperationException::class);
+            $this->expectExceptionMessage('Invalid Host');
 
             $request->getHost();
         }
@@ -2202,15 +2127,12 @@ class RequestTest extends TestCase
         ];
     }
 
-    /**
-     * @group legacy
-     * @expectedDeprecation Checking only for cacheable HTTP methods with Symfony\Component\HttpFoundation\Request::isMethodSafe() is deprecated since Symfony 3.2 and will throw an exception in 4.0. Disable checking only for cacheable methods by calling the method with `false` as first argument or use the Request::isMethodCacheable() instead.
-     */
     public function testMethodSafeChecksCacheable()
     {
+        $this->expectException('BadMethodCallException');
         $request = new Request();
         $request->setMethod('OPTIONS');
-        $this->assertFalse($request->isMethodSafe());
+        $request->isMethodSafe(true);
     }
 
     /**
@@ -2240,61 +2162,6 @@ class RequestTest extends TestCase
     }
 
     /**
-     * @group legacy
-     */
-    public function testGetTrustedHeaderName()
-    {
-        Request::setTrustedProxies(['8.8.8.8'], Request::HEADER_X_FORWARDED_ALL);
-
-        $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_FORWARDED));
-        $this->assertSame('X_FORWARDED_FOR', Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP));
-        $this->assertSame('X_FORWARDED_HOST', Request::getTrustedHeaderName(Request::HEADER_CLIENT_HOST));
-        $this->assertSame('X_FORWARDED_PORT', Request::getTrustedHeaderName(Request::HEADER_CLIENT_PORT));
-        $this->assertSame('X_FORWARDED_PROTO', Request::getTrustedHeaderName(Request::HEADER_CLIENT_PROTO));
-
-        Request::setTrustedProxies(['8.8.8.8'], Request::HEADER_FORWARDED);
-
-        $this->assertSame('FORWARDED', Request::getTrustedHeaderName(Request::HEADER_FORWARDED));
-        $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP));
-        $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_CLIENT_HOST));
-        $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_CLIENT_PORT));
-        $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_CLIENT_PROTO));
-
-        Request::setTrustedHeaderName(Request::HEADER_FORWARDED, 'A');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, 'B');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, 'C');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, 'D');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, 'E');
-
-        Request::setTrustedProxies(['8.8.8.8'], Request::HEADER_FORWARDED);
-
-        $this->assertSame('A', Request::getTrustedHeaderName(Request::HEADER_FORWARDED));
-        $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP));
-        $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_CLIENT_HOST));
-        $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_CLIENT_PORT));
-        $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_CLIENT_PROTO));
-
-        Request::setTrustedProxies(['8.8.8.8'], Request::HEADER_X_FORWARDED_ALL);
-
-        $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_FORWARDED));
-        $this->assertSame('B', Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP));
-        $this->assertSame('C', Request::getTrustedHeaderName(Request::HEADER_CLIENT_HOST));
-        $this->assertSame('D', Request::getTrustedHeaderName(Request::HEADER_CLIENT_PORT));
-        $this->assertSame('E', Request::getTrustedHeaderName(Request::HEADER_CLIENT_PROTO));
-
-        Request::setTrustedProxies(['8.8.8.8'], Request::HEADER_FORWARDED);
-
-        $this->assertSame('A', Request::getTrustedHeaderName(Request::HEADER_FORWARDED));
-
-        //reset
-        Request::setTrustedHeaderName(Request::HEADER_FORWARDED, 'FORWARDED');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, 'X_FORWARDED_FOR');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, 'X_FORWARDED_HOST');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, 'X_FORWARDED_PORT');
-        Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, 'X_FORWARDED_PROTO');
-    }
-
-    /**
      * @dataProvider protocolVersionProvider
      */
     public function testProtocolVersion($serverProtocol, $trustedProxy, $via, $expected)
@@ -2427,6 +2294,18 @@ class RequestTest extends TestCase
 
         $this->assertSame(443, $request->getPort());
     }
+
+    public function testTrustedPortDoesNotDefaultToZero()
+    {
+        Request::setTrustedProxies(['1.1.1.1'], Request::HEADER_X_FORWARDED_ALL);
+
+        $request = Request::create('/');
+        $request->server->set('REMOTE_ADDR', '1.1.1.1');
+        $request->headers->set('X-Forwarded-Host', 'test.example.com');
+        $request->headers->set('X-Forwarded-Port', '');
+
+        $this->assertSame(80, $request->getPort());
+    }
 }
 
 class RequestContentProxy extends Request
diff --git a/vendor/symfony/http-foundation/Tests/ResponseFunctionalTest.php b/vendor/symfony/http-foundation/Tests/ResponseFunctionalTest.php
index 3d3e696..21a66bb 100644
--- a/vendor/symfony/http-foundation/Tests/ResponseFunctionalTest.php
+++ b/vendor/symfony/http-foundation/Tests/ResponseFunctionalTest.php
@@ -20,7 +20,7 @@ class ResponseFunctionalTest extends TestCase
 {
     private static $server;
 
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         $spec = [
             1 => ['file', '/dev/null', 'w'],
@@ -32,7 +32,7 @@ class ResponseFunctionalTest extends TestCase
         sleep(1);
     }
 
-    public static function tearDownAfterClass()
+    public static function tearDownAfterClass(): void
     {
         if (self::$server) {
             proc_terminate(self::$server);
diff --git a/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php b/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php
index 93aacf2..dc4f710 100644
--- a/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php
@@ -110,9 +110,9 @@ class ResponseHeaderBagTest extends TestCase
     public function testToStringIncludesCookieHeaders()
     {
         $bag = new ResponseHeaderBag([]);
-        $bag->setCookie(new Cookie('foo', 'bar'));
+        $bag->setCookie(Cookie::create('foo', 'bar'));
 
-        $this->assertSetCookieHeader('foo=bar; path=/; httponly', $bag);
+        $this->assertSetCookieHeader('foo=bar; path=/; httponly; samesite=lax', $bag);
 
         $bag->clearCookie('foo');
 
@@ -154,24 +154,24 @@ class ResponseHeaderBagTest extends TestCase
     public function testCookiesWithSameNames()
     {
         $bag = new ResponseHeaderBag();
-        $bag->setCookie(new Cookie('foo', 'bar', 0, '/path/foo', 'foo.bar'));
-        $bag->setCookie(new Cookie('foo', 'bar', 0, '/path/bar', 'foo.bar'));
-        $bag->setCookie(new Cookie('foo', 'bar', 0, '/path/bar', 'bar.foo'));
-        $bag->setCookie(new Cookie('foo', 'bar'));
+        $bag->setCookie(Cookie::create('foo', 'bar', 0, '/path/foo', 'foo.bar'));
+        $bag->setCookie(Cookie::create('foo', 'bar', 0, '/path/bar', 'foo.bar'));
+        $bag->setCookie(Cookie::create('foo', 'bar', 0, '/path/bar', 'bar.foo'));
+        $bag->setCookie(Cookie::create('foo', 'bar'));
 
         $this->assertCount(4, $bag->getCookies());
-        $this->assertEquals('foo=bar; path=/path/foo; domain=foo.bar; httponly', $bag->get('set-cookie'));
+        $this->assertEquals('foo=bar; path=/path/foo; domain=foo.bar; httponly; samesite=lax', $bag->get('set-cookie'));
         $this->assertEquals([
-            'foo=bar; path=/path/foo; domain=foo.bar; httponly',
-            'foo=bar; path=/path/bar; domain=foo.bar; httponly',
-            'foo=bar; path=/path/bar; domain=bar.foo; httponly',
-            'foo=bar; path=/; httponly',
+            'foo=bar; path=/path/foo; domain=foo.bar; httponly; samesite=lax',
+            'foo=bar; path=/path/bar; domain=foo.bar; httponly; samesite=lax',
+            'foo=bar; path=/path/bar; domain=bar.foo; httponly; samesite=lax',
+            'foo=bar; path=/; httponly; samesite=lax',
         ], $bag->get('set-cookie', null, false));
 
-        $this->assertSetCookieHeader('foo=bar; path=/path/foo; domain=foo.bar; httponly', $bag);
-        $this->assertSetCookieHeader('foo=bar; path=/path/bar; domain=foo.bar; httponly', $bag);
-        $this->assertSetCookieHeader('foo=bar; path=/path/bar; domain=bar.foo; httponly', $bag);
-        $this->assertSetCookieHeader('foo=bar; path=/; httponly', $bag);
+        $this->assertSetCookieHeader('foo=bar; path=/path/foo; domain=foo.bar; httponly; samesite=lax', $bag);
+        $this->assertSetCookieHeader('foo=bar; path=/path/bar; domain=foo.bar; httponly; samesite=lax', $bag);
+        $this->assertSetCookieHeader('foo=bar; path=/path/bar; domain=bar.foo; httponly; samesite=lax', $bag);
+        $this->assertSetCookieHeader('foo=bar; path=/; httponly; samesite=lax', $bag);
 
         $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY);
 
@@ -186,8 +186,8 @@ class ResponseHeaderBagTest extends TestCase
         $bag = new ResponseHeaderBag();
         $this->assertFalse($bag->has('set-cookie'));
 
-        $bag->setCookie(new Cookie('foo', 'bar', 0, '/path/foo', 'foo.bar'));
-        $bag->setCookie(new Cookie('bar', 'foo', 0, '/path/bar', 'foo.bar'));
+        $bag->setCookie(Cookie::create('foo', 'bar', 0, '/path/foo', 'foo.bar'));
+        $bag->setCookie(Cookie::create('bar', 'foo', 0, '/path/bar', 'foo.bar'));
         $this->assertTrue($bag->has('set-cookie'));
 
         $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY);
@@ -209,8 +209,8 @@ class ResponseHeaderBagTest extends TestCase
     public function testRemoveCookieWithNullRemove()
     {
         $bag = new ResponseHeaderBag();
-        $bag->setCookie(new Cookie('foo', 'bar', 0));
-        $bag->setCookie(new Cookie('bar', 'foo', 0));
+        $bag->setCookie(Cookie::create('foo', 'bar'));
+        $bag->setCookie(Cookie::create('bar', 'foo'));
 
         $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY);
         $this->assertArrayHasKey('/', $cookies['']);
@@ -228,48 +228,26 @@ class ResponseHeaderBagTest extends TestCase
     {
         $bag = new ResponseHeaderBag();
         $bag->set('set-cookie', 'foo=bar');
-        $this->assertEquals([new Cookie('foo', 'bar', 0, '/', null, false, false, true)], $bag->getCookies());
+        $this->assertEquals([Cookie::create('foo', 'bar', 0, '/', null, false, false, true, null)], $bag->getCookies());
 
         $bag->set('set-cookie', 'foo2=bar2', false);
         $this->assertEquals([
-            new Cookie('foo', 'bar', 0, '/', null, false, false, true),
-            new Cookie('foo2', 'bar2', 0, '/', null, false, false, true),
+            Cookie::create('foo', 'bar', 0, '/', null, false, false, true, null),
+            Cookie::create('foo2', 'bar2', 0, '/', null, false, false, true, null),
         ], $bag->getCookies());
 
         $bag->remove('set-cookie');
         $this->assertEquals([], $bag->getCookies());
     }
 
-    /**
-     * @expectedException \InvalidArgumentException
-     */
     public function testGetCookiesWithInvalidArgument()
     {
+        $this->expectException('InvalidArgumentException');
         $bag = new ResponseHeaderBag();
 
         $bag->getCookies('invalid_argument');
     }
 
-    /**
-     * @expectedException \InvalidArgumentException
-     */
-    public function testMakeDispositionInvalidDisposition()
-    {
-        $headers = new ResponseHeaderBag();
-
-        $headers->makeDisposition('invalid', 'foo.html');
-    }
-
-    /**
-     * @dataProvider provideMakeDisposition
-     */
-    public function testMakeDisposition($disposition, $filename, $filenameFallback, $expected)
-    {
-        $headers = new ResponseHeaderBag();
-
-        $this->assertEquals($expected, $headers->makeDisposition($disposition, $filename, $filenameFallback));
-    }
-
     public function testToStringDoesntMessUpHeaders()
     {
         $headers = new ResponseHeaderBag();
@@ -284,41 +262,6 @@ class ResponseHeaderBagTest extends TestCase
         $this->assertEquals(['text/html'], $allHeaders['Content-type']);
     }
 
-    public function provideMakeDisposition()
-    {
-        return [
-            ['attachment', 'foo.html', 'foo.html', 'attachment; filename="foo.html"'],
-            ['attachment', 'foo.html', '', 'attachment; filename="foo.html"'],
-            ['attachment', 'foo bar.html', '', 'attachment; filename="foo bar.html"'],
-            ['attachment', 'foo "bar".html', '', 'attachment; filename="foo \\"bar\\".html"'],
-            ['attachment', 'foo%20bar.html', 'foo bar.html', 'attachment; filename="foo bar.html"; filename*=utf-8\'\'foo%2520bar.html'],
-            ['attachment', 'föö.html', 'foo.html', 'attachment; filename="foo.html"; filename*=utf-8\'\'f%C3%B6%C3%B6.html'],
-        ];
-    }
-
-    /**
-     * @dataProvider provideMakeDispositionFail
-     * @expectedException \InvalidArgumentException
-     */
-    public function testMakeDispositionFail($disposition, $filename)
-    {
-        $headers = new ResponseHeaderBag();
-
-        $headers->makeDisposition($disposition, $filename);
-    }
-
-    public function provideMakeDispositionFail()
-    {
-        return [
-            ['attachment', 'foo%20bar.html'],
-            ['attachment', 'foo/bar.html'],
-            ['attachment', '/foo.html'],
-            ['attachment', 'foo\bar.html'],
-            ['attachment', '\foo.html'],
-            ['attachment', 'föö.html'],
-        ];
-    }
-
     public function testDateHeaderAddedOnCreation()
     {
         $now = time();
diff --git a/vendor/symfony/http-foundation/Tests/ResponseTest.php b/vendor/symfony/http-foundation/Tests/ResponseTest.php
index fe6bc02..ad1f806 100644
--- a/vendor/symfony/http-foundation/Tests/ResponseTest.php
+++ b/vendor/symfony/http-foundation/Tests/ResponseTest.php
@@ -11,6 +11,7 @@
 
 namespace Symfony\Component\HttpFoundation\Tests;
 
+use Symfony\Component\HttpFoundation\Cookie;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
 
@@ -305,7 +306,7 @@ class ResponseTest extends ResponseTestCase
         $response = new Response();
         $response->headers->set('Cache-Control', 'must-revalidate');
         $response->headers->set('Expires', -1);
-        $this->assertEquals('Sat, 01 Jan 00 00:00:00 +0000', $response->getExpires()->format(DATE_RFC822));
+        $this->assertLessThanOrEqual(time() - 2 * 86400, $response->getExpires()->format('U'));
 
         $response = new Response();
         $this->assertNull($response->getMaxAge(), '->getMaxAge() returns null if no freshness information available');
@@ -369,6 +370,12 @@ class ResponseTest extends ResponseTestCase
         $this->assertNull($response->headers->get('Expires'), '->expire() removes the Expires header when the response is fresh');
     }
 
+    public function testNullExpireHeader()
+    {
+        $response = new Response(null, 200, ['Expires' => null]);
+        $this->assertNull($response->getExpires());
+    }
+
     public function testGetTtl()
     {
         $response = new Response();
@@ -532,7 +539,6 @@ class ResponseTest extends ResponseTestCase
         $response->prepare($request);
         $this->assertEquals('', $response->getContent());
         $this->assertFalse($response->headers->has('Content-Type'));
-        $this->assertFalse($response->headers->has('Content-Type'));
 
         $response->setContent('content');
         $response->setStatusCode(304);
@@ -573,6 +579,24 @@ class ResponseTest extends ResponseTestCase
         $this->assertFalse($response->headers->has('expires'));
     }
 
+    public function testPrepareSetsCookiesSecure()
+    {
+        $cookie = Cookie::create('foo', 'bar');
+
+        $response = new Response('foo');
+        $response->headers->setCookie($cookie);
+
+        $request = Request::create('/', 'GET');
+        $response->prepare($request);
+
+        $this->assertFalse($cookie->isSecure());
+
+        $request = Request::create('https://localhost/', 'GET');
+        $response->prepare($request);
+
+        $this->assertTrue($cookie->isSecure());
+    }
+
     public function testSetCache()
     {
         $response = new Response();
@@ -582,7 +606,7 @@ class ResponseTest extends ResponseTestCase
             $this->fail('->setCache() throws an InvalidArgumentException if an option is not supported');
         } catch (\Exception $e) {
             $this->assertInstanceOf('InvalidArgumentException', $e, '->setCache() throws an InvalidArgumentException if an option is not supported');
-            $this->assertContains('"wrong option"', $e->getMessage());
+            $this->assertStringContainsString('"wrong option"', $e->getMessage());
         }
 
         $options = ['etag' => '"whatever"'];
@@ -635,7 +659,7 @@ class ResponseTest extends ResponseTestCase
         ob_start();
         $response->sendContent();
         $string = ob_get_clean();
-        $this->assertContains('test response rendering', $string);
+        $this->assertStringContainsString('test response rendering', $string);
     }
 
     public function testSetPublic()
@@ -663,6 +687,22 @@ class ResponseTest extends ResponseTestCase
         $this->assertTrue($response->isImmutable());
     }
 
+    public function testSetDate()
+    {
+        $response = new Response();
+        $response->setDate(\DateTime::createFromFormat(\DateTime::ATOM, '2013-01-26T09:21:56+0100', new \DateTimeZone('Europe/Berlin')));
+
+        $this->assertEquals('2013-01-26T08:21:56+00:00', $response->getDate()->format(\DateTime::ATOM));
+    }
+
+    public function testSetDateWithImmutable()
+    {
+        $response = new Response();
+        $response->setDate(\DateTimeImmutable::createFromFormat(\DateTime::ATOM, '2013-01-26T09:21:56+0100', new \DateTimeZone('Europe/Berlin')));
+
+        $this->assertEquals('2013-01-26T08:21:56+00:00', $response->getDate()->format(\DateTime::ATOM));
+    }
+
     public function testSetExpires()
     {
         $response = new Response();
@@ -676,6 +716,16 @@ class ResponseTest extends ResponseTestCase
         $this->assertEquals($response->getExpires()->getTimestamp(), $now->getTimestamp());
     }
 
+    public function testSetExpiresWithImmutable()
+    {
+        $response = new Response();
+
+        $now = $this->createDateTimeImmutableNow();
+        $response->setExpires($now);
+
+        $this->assertEquals($response->getExpires()->getTimestamp(), $now->getTimestamp());
+    }
+
     public function testSetLastModified()
     {
         $response = new Response();
@@ -686,6 +736,16 @@ class ResponseTest extends ResponseTestCase
         $this->assertNull($response->getLastModified());
     }
 
+    public function testSetLastModifiedWithImmutable()
+    {
+        $response = new Response();
+        $response->setLastModified($this->createDateTimeImmutableNow());
+        $this->assertNotNull($response->getLastModified());
+
+        $response->setLastModified(null);
+        $this->assertNull($response->getLastModified());
+    }
+
     public function testIsInvalid()
     {
         $response = new Response();
@@ -846,11 +906,11 @@ class ResponseTest extends ResponseTestCase
     }
 
     /**
-     * @expectedException \UnexpectedValueException
      * @dataProvider invalidContentProvider
      */
     public function testSetContentInvalid($content)
     {
+        $this->expectException('UnexpectedValueException');
         $response = new Response();
         $response->setContent($content);
     }
@@ -922,17 +982,24 @@ class ResponseTest extends ResponseTestCase
         return $date->setTimestamp(time());
     }
 
+    protected function createDateTimeImmutableNow()
+    {
+        $date = new \DateTimeImmutable();
+
+        return $date->setTimestamp(time());
+    }
+
     protected function provideResponse()
     {
         return new Response();
     }
 
     /**
-     * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
+     * @see http://github.com/zendframework/zend-diactoros for the canonical source repository
      *
-     * @author    Fábio Pacheco
+     * @author Fábio Pacheco
      * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
-     * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
+     * @license https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
      */
     public function ianaCodesReasonPhrasesProvider()
     {
@@ -1001,14 +1068,3 @@ class StringableObject
 class DefaultResponse extends Response
 {
 }
-
-class ExtendedResponse extends Response
-{
-    public function setLastModified(\DateTime $date = null)
-    {
-    }
-
-    public function getDate()
-    {
-    }
-}
diff --git a/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php b/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php
index 3f2f7b3..6313967 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php
@@ -28,7 +28,7 @@ class AttributeBagTest extends TestCase
      */
     private $bag;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->array = [
             'hello' => 'world',
@@ -45,11 +45,11 @@ class AttributeBagTest extends TestCase
                 ],
             ],
         ];
-        $this->bag = new AttributeBag('_sf2');
+        $this->bag = new AttributeBag('_sf');
         $this->bag->initialize($this->array);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         $this->bag = null;
         $this->array = [];
@@ -67,7 +67,7 @@ class AttributeBagTest extends TestCase
 
     public function testGetStorageKey()
     {
-        $this->assertEquals('_sf2', $this->bag->getStorageKey());
+        $this->assertEquals('_sf', $this->bag->getStorageKey());
         $attributeBag = new AttributeBag('test');
         $this->assertEquals('test', $attributeBag->getStorageKey());
     }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php b/vendor/symfony/http-foundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php
index 6b4bb17..3a3251d 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php
@@ -28,7 +28,7 @@ class NamespacedAttributeBagTest extends TestCase
      */
     private $bag;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->array = [
             'hello' => 'world',
@@ -49,7 +49,7 @@ class NamespacedAttributeBagTest extends TestCase
         $this->bag->initialize($this->array);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         $this->bag = null;
         $this->array = [];
diff --git a/vendor/symfony/http-foundation/Tests/Session/Flash/AutoExpireFlashBagTest.php b/vendor/symfony/http-foundation/Tests/Session/Flash/AutoExpireFlashBagTest.php
index b4e2c3a..ba26871 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Flash/AutoExpireFlashBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Flash/AutoExpireFlashBagTest.php
@@ -28,7 +28,7 @@ class AutoExpireFlashBagTest extends TestCase
 
     protected $array = [];
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->bag = new FlashBag();
@@ -36,7 +36,7 @@ class AutoExpireFlashBagTest extends TestCase
         $this->bag->initialize($this->array);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         $this->bag = null;
         parent::tearDown();
diff --git a/vendor/symfony/http-foundation/Tests/Session/Flash/FlashBagTest.php b/vendor/symfony/http-foundation/Tests/Session/Flash/FlashBagTest.php
index 6d8619e..24dbbfe 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Flash/FlashBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Flash/FlashBagTest.php
@@ -28,7 +28,7 @@ class FlashBagTest extends TestCase
 
     protected $array = [];
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->bag = new FlashBag();
@@ -36,7 +36,7 @@ class FlashBagTest extends TestCase
         $this->bag->initialize($this->array);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         $this->bag = null;
         parent::tearDown();
diff --git a/vendor/symfony/http-foundation/Tests/Session/SessionTest.php b/vendor/symfony/http-foundation/Tests/Session/SessionTest.php
index acb1299..e216bfc 100644
--- a/vendor/symfony/http-foundation/Tests/Session/SessionTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/SessionTest.php
@@ -37,13 +37,13 @@ class SessionTest extends TestCase
      */
     protected $session;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->storage = new MockArraySessionStorage();
         $this->session = new Session($this->storage, new AttributeBag(), new FlashBag());
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         $this->storage = null;
         $this->session = null;
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/AbstractSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/AbstractSessionHandlerTest.php
index 98bc67b..b25b68b 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/AbstractSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/AbstractSessionHandlerTest.php
@@ -13,14 +13,11 @@ namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler;
 
 use PHPUnit\Framework\TestCase;
 
-/**
- * @requires PHP 7.0
- */
 class AbstractSessionHandlerTest extends TestCase
 {
     private static $server;
 
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         $spec = [
             1 => ['file', '/dev/null', 'w'],
@@ -32,7 +29,7 @@ class AbstractSessionHandlerTest extends TestCase
         sleep(1);
     }
 
-    public static function tearDownAfterClass()
+    public static function tearDownAfterClass(): void
     {
         if (self::$server) {
             proc_terminate(self::$server);
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/common.inc b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/common.inc
index 7a064c7..a887f60 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/common.inc
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/common.inc
@@ -60,14 +60,14 @@ class TestSessionHandler extends AbstractSessionHandler
         $this->data = $data;
     }
 
-    public function open($path, $name)
+    public function open($path, $name): bool
     {
         echo __FUNCTION__, "\n";
 
         return parent::open($path, $name);
     }
 
-    public function validateId($sessionId)
+    public function validateId($sessionId): bool
     {
         echo __FUNCTION__, "\n";
 
@@ -77,7 +77,7 @@ class TestSessionHandler extends AbstractSessionHandler
     /**
      * {@inheritdoc}
      */
-    public function read($sessionId)
+    public function read($sessionId): string
     {
         echo __FUNCTION__, "\n";
 
@@ -87,7 +87,7 @@ class TestSessionHandler extends AbstractSessionHandler
     /**
      * {@inheritdoc}
      */
-    public function updateTimestamp($sessionId, $data)
+    public function updateTimestamp($sessionId, $data): bool
     {
         echo __FUNCTION__, "\n";
 
@@ -97,7 +97,7 @@ class TestSessionHandler extends AbstractSessionHandler
     /**
      * {@inheritdoc}
      */
-    public function write($sessionId, $data)
+    public function write($sessionId, $data): bool
     {
         echo __FUNCTION__, "\n";
 
@@ -107,42 +107,42 @@ class TestSessionHandler extends AbstractSessionHandler
     /**
      * {@inheritdoc}
      */
-    public function destroy($sessionId)
+    public function destroy($sessionId): bool
     {
         echo __FUNCTION__, "\n";
 
         return parent::destroy($sessionId);
     }
 
-    public function close()
+    public function close(): bool
     {
         echo __FUNCTION__, "\n";
 
         return true;
     }
 
-    public function gc($maxLifetime)
+    public function gc($maxLifetime): bool
     {
         echo __FUNCTION__, "\n";
 
         return true;
     }
 
-    protected function doRead($sessionId)
+    protected function doRead($sessionId): string
     {
         echo __FUNCTION__.': ', $this->data, "\n";
 
         return $this->data;
     }
 
-    protected function doWrite($sessionId, $data)
+    protected function doWrite($sessionId, $data): bool
     {
         echo __FUNCTION__.': ', $data, "\n";
 
         return true;
     }
 
-    protected function doDestroy($sessionId)
+    protected function doDestroy($sessionId): bool
     {
         echo __FUNCTION__, "\n";
 
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.expected b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.expected
index 4533a10..05a5d5d 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.expected
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.expected
@@ -11,10 +11,11 @@ $_SESSION is not empty
 write
 destroy
 close
-$_SESSION is not empty
+$_SESSION is empty
 Array
 (
     [0] => Content-Type: text/plain; charset=utf-8
     [1] => Cache-Control: max-age=0, private, must-revalidate
+    [2] => Set-Cookie: sid=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; secure; HttpOnly
 )
 shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.expected b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.expected
index 5de2d9e..6307822 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.expected
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.expected
@@ -20,5 +20,6 @@ Array
     [0] => Content-Type: text/plain; charset=utf-8
     [1] => Cache-Control: max-age=10800, private, must-revalidate
     [2] => Set-Cookie: abc=def
+    [3] => Set-Cookie: sid=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; secure; HttpOnly
 )
 shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php
deleted file mode 100644
index d7a324f..0000000
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php
+++ /dev/null
@@ -1,135 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler;
-
-use PHPUnit\Framework\TestCase;
-use Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcacheSessionHandler;
-
-/**
- * @requires extension memcache
- * @group time-sensitive
- * @group legacy
- */
-class MemcacheSessionHandlerTest extends TestCase
-{
-    const PREFIX = 'prefix_';
-    const TTL = 1000;
-
-    /**
-     * @var MemcacheSessionHandler
-     */
-    protected $storage;
-
-    protected $memcache;
-
-    protected function setUp()
-    {
-        if (\defined('HHVM_VERSION')) {
-            $this->markTestSkipped('PHPUnit_MockObject cannot mock the Memcache class on HHVM. See https://github.com/sebastianbergmann/phpunit-mock-objects/pull/289');
-        }
-
-        parent::setUp();
-        $this->memcache = $this->getMockBuilder('Memcache')->getMock();
-        $this->storage = new MemcacheSessionHandler(
-            $this->memcache,
-            ['prefix' => self::PREFIX, 'expiretime' => self::TTL]
-        );
-    }
-
-    protected function tearDown()
-    {
-        $this->memcache = null;
-        $this->storage = null;
-        parent::tearDown();
-    }
-
-    public function testOpenSession()
-    {
-        $this->assertTrue($this->storage->open('', ''));
-    }
-
-    public function testCloseSession()
-    {
-        $this->assertTrue($this->storage->close());
-    }
-
-    public function testReadSession()
-    {
-        $this->memcache
-            ->expects($this->once())
-            ->method('get')
-            ->with(self::PREFIX.'id')
-        ;
-
-        $this->assertEquals('', $this->storage->read('id'));
-    }
-
-    public function testWriteSession()
-    {
-        $this->memcache
-            ->expects($this->once())
-            ->method('set')
-            ->with(self::PREFIX.'id', 'data', 0, $this->equalTo(time() + self::TTL, 2))
-            ->willReturn(true)
-        ;
-
-        $this->assertTrue($this->storage->write('id', 'data'));
-    }
-
-    public function testDestroySession()
-    {
-        $this->memcache
-            ->expects($this->once())
-            ->method('delete')
-            ->with(self::PREFIX.'id')
-            ->willReturn(true)
-        ;
-
-        $this->assertTrue($this->storage->destroy('id'));
-    }
-
-    public function testGcSession()
-    {
-        $this->assertTrue($this->storage->gc(123));
-    }
-
-    /**
-     * @dataProvider getOptionFixtures
-     */
-    public function testSupportedOptions($options, $supported)
-    {
-        try {
-            new MemcacheSessionHandler($this->memcache, $options);
-            $this->assertTrue($supported);
-        } catch (\InvalidArgumentException $e) {
-            $this->assertFalse($supported);
-        }
-    }
-
-    public function getOptionFixtures()
-    {
-        return [
-            [['prefix' => 'session'], true],
-            [['expiretime' => 100], true],
-            [['prefix' => 'session', 'expiretime' => 200], true],
-            [['expiretime' => 100, 'foo' => 'bar'], false],
-        ];
-    }
-
-    public function testGetConnection()
-    {
-        $method = new \ReflectionMethod($this->storage, 'getMemcache');
-        $method->setAccessible(true);
-
-        $this->assertInstanceOf('\Memcache', $method->invoke($this->storage));
-    }
-}
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php
index c3deb7a..e9c1770 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php
@@ -30,12 +30,8 @@ class MemcachedSessionHandlerTest extends TestCase
 
     protected $memcached;
 
-    protected function setUp()
+    protected function setUp(): void
     {
-        if (\defined('HHVM_VERSION')) {
-            $this->markTestSkipped('PHPUnit_MockObject cannot mock the Memcached class on HHVM. See https://github.com/sebastianbergmann/phpunit-mock-objects/pull/289');
-        }
-
         parent::setUp();
 
         if (version_compare(phpversion('memcached'), '2.2.0', '>=') && version_compare(phpversion('memcached'), '3.0.0b1', '<')) {
@@ -49,7 +45,7 @@ class MemcachedSessionHandlerTest extends TestCase
         );
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         $this->memcached = null;
         $this->storage = null;
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php
index 5ce6a9e..f956fa2 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php
@@ -11,42 +11,33 @@
 
 namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler;
 
+use PHPUnit\Framework\MockObject\MockObject;
 use PHPUnit\Framework\TestCase;
 use Symfony\Component\HttpFoundation\Session\Storage\Handler\MongoDbSessionHandler;
 
 /**
  * @author Markus Bachmann <markus.bachmann@bachi.biz>
  * @group time-sensitive
- * @group legacy
+ * @requires extension mongodb
  */
 class MongoDbSessionHandlerTest extends TestCase
 {
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var MockObject
      */
     private $mongo;
     private $storage;
     public $options;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
-        if (\extension_loaded('mongodb')) {
-            if (!class_exists('MongoDB\Client')) {
-                $this->markTestSkipped('The mongodb/mongodb package is required.');
-            }
-        } elseif (!\extension_loaded('mongo')) {
-            $this->markTestSkipped('The Mongo or MongoDB extension is required.');
+        if (!class_exists(\MongoDB\Client::class)) {
+            $this->markTestSkipped('The mongodb/mongodb package is required.');
         }
 
-        if (phpversion('mongodb')) {
-            $mongoClass = 'MongoDB\Client';
-        } else {
-            $mongoClass = version_compare(phpversion('mongo'), '1.3.0', '<') ? 'Mongo' : 'MongoClient';
-        }
-
-        $this->mongo = $this->getMockBuilder($mongoClass)
+        $this->mongo = $this->getMockBuilder(\MongoDB\Client::class)
             ->disableOriginalConstructor()
             ->getMock();
 
@@ -55,26 +46,16 @@ class MongoDbSessionHandlerTest extends TestCase
             'data_field' => 'data',
             'time_field' => 'time',
             'expiry_field' => 'expires_at',
-            'database' => 'sf2-test',
+            'database' => 'sf-test',
             'collection' => 'session-test',
         ];
 
         $this->storage = new MongoDbSessionHandler($this->mongo, $this->options);
     }
 
-    /**
-     * @expectedException \InvalidArgumentException
-     */
-    public function testConstructorShouldThrowExceptionForInvalidMongo()
-    {
-        new MongoDbSessionHandler(new \stdClass(), $this->options);
-    }
-
-    /**
-     * @expectedException \InvalidArgumentException
-     */
     public function testConstructorShouldThrowExceptionForMissingOptions()
     {
+        $this->expectException('InvalidArgumentException');
         new MongoDbSessionHandler($this->mongo, []);
     }
 
@@ -110,27 +91,14 @@ class MongoDbSessionHandlerTest extends TestCase
                 $this->assertArrayHasKey($this->options['expiry_field'], $criteria);
                 $this->assertArrayHasKey('$gte', $criteria[$this->options['expiry_field']]);
 
-                if (phpversion('mongodb')) {
-                    $this->assertInstanceOf('MongoDB\BSON\UTCDateTime', $criteria[$this->options['expiry_field']]['$gte']);
-                    $this->assertGreaterThanOrEqual(round((string) $criteria[$this->options['expiry_field']]['$gte'] / 1000), $testTimeout);
-                } else {
-                    $this->assertInstanceOf('MongoDate', $criteria[$this->options['expiry_field']]['$gte']);
-                    $this->assertGreaterThanOrEqual($criteria[$this->options['expiry_field']]['$gte']->sec, $testTimeout);
-                }
+                $this->assertInstanceOf(\MongoDB\BSON\UTCDateTime::class, $criteria[$this->options['expiry_field']]['$gte']);
+                $this->assertGreaterThanOrEqual(round((string) $criteria[$this->options['expiry_field']]['$gte'] / 1000), $testTimeout);
 
-                $fields = [
+                return [
                     $this->options['id_field'] => 'foo',
+                    $this->options['expiry_field'] => new \MongoDB\BSON\UTCDateTime(),
+                    $this->options['data_field'] => new \MongoDB\BSON\Binary('bar', \MongoDB\BSON\Binary::TYPE_OLD_BINARY),
                 ];
-
-                if (phpversion('mongodb')) {
-                    $fields[$this->options['data_field']] = new \MongoDB\BSON\Binary('bar', \MongoDB\BSON\Binary::TYPE_OLD_BINARY);
-                    $fields[$this->options['id_field']] = new \MongoDB\BSON\UTCDateTime(time() * 1000);
-                } else {
-                    $fields[$this->options['data_field']] = new \MongoBinData('bar', \MongoBinData::BYTE_ARRAY);
-                    $fields[$this->options['id_field']] = new \MongoDate();
-                }
-
-                return $fields;
             });
 
         $this->assertEquals('bar', $this->storage->read('foo'));
@@ -145,89 +113,22 @@ class MongoDbSessionHandlerTest extends TestCase
             ->with($this->options['database'], $this->options['collection'])
             ->willReturn($collection);
 
-        $data = [];
-
-        $methodName = phpversion('mongodb') ? 'updateOne' : 'update';
-
         $collection->expects($this->once())
-            ->method($methodName)
-            ->willReturnCallback(function ($criteria, $updateData, $options) use (&$data) {
+            ->method('updateOne')
+            ->willReturnCallback(function ($criteria, $updateData, $options) {
                 $this->assertEquals([$this->options['id_field'] => 'foo'], $criteria);
-
-                if (phpversion('mongodb')) {
-                    $this->assertEquals(['upsert' => true], $options);
-                } else {
-                    $this->assertEquals(['upsert' => true, 'multiple' => false], $options);
-                }
+                $this->assertEquals(['upsert' => true], $options);
 
                 $data = $updateData['$set'];
+                $expectedExpiry = time() + (int) ini_get('session.gc_maxlifetime');
+                $this->assertInstanceOf(\MongoDB\BSON\Binary::class, $data[$this->options['data_field']]);
+                $this->assertEquals('bar', $data[$this->options['data_field']]->getData());
+                $this->assertInstanceOf(\MongoDB\BSON\UTCDateTime::class, $data[$this->options['time_field']]);
+                $this->assertInstanceOf(\MongoDB\BSON\UTCDateTime::class, $data[$this->options['expiry_field']]);
+                $this->assertGreaterThanOrEqual($expectedExpiry, round((string) $data[$this->options['expiry_field']] / 1000));
             });
 
-        $expectedExpiry = time() + (int) ini_get('session.gc_maxlifetime');
         $this->assertTrue($this->storage->write('foo', 'bar'));
-
-        if (phpversion('mongodb')) {
-            $this->assertEquals('bar', $data[$this->options['data_field']]->getData());
-            $this->assertInstanceOf('MongoDB\BSON\UTCDateTime', $data[$this->options['time_field']]);
-            $this->assertInstanceOf('MongoDB\BSON\UTCDateTime', $data[$this->options['expiry_field']]);
-            $this->assertGreaterThanOrEqual($expectedExpiry, round((string) $data[$this->options['expiry_field']] / 1000));
-        } else {
-            $this->assertEquals('bar', $data[$this->options['data_field']]->bin);
-            $this->assertInstanceOf('MongoDate', $data[$this->options['time_field']]);
-            $this->assertInstanceOf('MongoDate', $data[$this->options['expiry_field']]);
-            $this->assertGreaterThanOrEqual($expectedExpiry, $data[$this->options['expiry_field']]->sec);
-        }
-    }
-
-    public function testWriteWhenUsingExpiresField()
-    {
-        $this->options = [
-            'id_field' => '_id',
-            'data_field' => 'data',
-            'time_field' => 'time',
-            'database' => 'sf2-test',
-            'collection' => 'session-test',
-            'expiry_field' => 'expiresAt',
-        ];
-
-        $this->storage = new MongoDbSessionHandler($this->mongo, $this->options);
-
-        $collection = $this->createMongoCollectionMock();
-
-        $this->mongo->expects($this->once())
-            ->method('selectCollection')
-            ->with($this->options['database'], $this->options['collection'])
-            ->willReturn($collection);
-
-        $data = [];
-
-        $methodName = phpversion('mongodb') ? 'updateOne' : 'update';
-
-        $collection->expects($this->once())
-            ->method($methodName)
-            ->willReturnCallback(function ($criteria, $updateData, $options) use (&$data) {
-                $this->assertEquals([$this->options['id_field'] => 'foo'], $criteria);
-
-                if (phpversion('mongodb')) {
-                    $this->assertEquals(['upsert' => true], $options);
-                } else {
-                    $this->assertEquals(['upsert' => true, 'multiple' => false], $options);
-                }
-
-                $data = $updateData['$set'];
-            });
-
-        $this->assertTrue($this->storage->write('foo', 'bar'));
-
-        if (phpversion('mongodb')) {
-            $this->assertEquals('bar', $data[$this->options['data_field']]->getData());
-            $this->assertInstanceOf('MongoDB\BSON\UTCDateTime', $data[$this->options['time_field']]);
-            $this->assertInstanceOf('MongoDB\BSON\UTCDateTime', $data[$this->options['expiry_field']]);
-        } else {
-            $this->assertEquals('bar', $data[$this->options['data_field']]->bin);
-            $this->assertInstanceOf('MongoDate', $data[$this->options['time_field']]);
-            $this->assertInstanceOf('MongoDate', $data[$this->options['expiry_field']]);
-        }
     }
 
     public function testReplaceSessionData()
@@ -241,10 +142,8 @@ class MongoDbSessionHandlerTest extends TestCase
 
         $data = [];
 
-        $methodName = phpversion('mongodb') ? 'updateOne' : 'update';
-
         $collection->expects($this->exactly(2))
-            ->method($methodName)
+            ->method('updateOne')
             ->willReturnCallback(function ($criteria, $updateData, $options) use (&$data) {
                 $data = $updateData;
             });
@@ -252,11 +151,7 @@ class MongoDbSessionHandlerTest extends TestCase
         $this->storage->write('foo', 'bar');
         $this->storage->write('foo', 'foobar');
 
-        if (phpversion('mongodb')) {
-            $this->assertEquals('foobar', $data['$set'][$this->options['data_field']]->getData());
-        } else {
-            $this->assertEquals('foobar', $data['$set'][$this->options['data_field']]->bin);
-        }
+        $this->assertEquals('foobar', $data['$set'][$this->options['data_field']]->getData());
     }
 
     public function testDestroy()
@@ -268,10 +163,8 @@ class MongoDbSessionHandlerTest extends TestCase
             ->with($this->options['database'], $this->options['collection'])
             ->willReturn($collection);
 
-        $methodName = phpversion('mongodb') ? 'deleteOne' : 'remove';
-
         $collection->expects($this->once())
-            ->method($methodName)
+            ->method('deleteOne')
             ->with([$this->options['id_field'] => 'foo']);
 
         $this->assertTrue($this->storage->destroy('foo'));
@@ -286,18 +179,11 @@ class MongoDbSessionHandlerTest extends TestCase
             ->with($this->options['database'], $this->options['collection'])
             ->willReturn($collection);
 
-        $methodName = phpversion('mongodb') ? 'deleteMany' : 'remove';
-
         $collection->expects($this->once())
-            ->method($methodName)
+            ->method('deleteMany')
             ->willReturnCallback(function ($criteria) {
-                if (phpversion('mongodb')) {
-                    $this->assertInstanceOf('MongoDB\BSON\UTCDateTime', $criteria[$this->options['expiry_field']]['$lt']);
-                    $this->assertGreaterThanOrEqual(time() - 1, round((string) $criteria[$this->options['expiry_field']]['$lt'] / 1000));
-                } else {
-                    $this->assertInstanceOf('MongoDate', $criteria[$this->options['expiry_field']]['$lt']);
-                    $this->assertGreaterThanOrEqual(time() - 1, $criteria[$this->options['expiry_field']]['$lt']->sec);
-                }
+                $this->assertInstanceOf(\MongoDB\BSON\UTCDateTime::class, $criteria[$this->options['expiry_field']]['$lt']);
+                $this->assertGreaterThanOrEqual(time() - 1, round((string) $criteria[$this->options['expiry_field']]['$lt'] / 1000));
             });
 
         $this->assertTrue($this->storage->gc(1));
@@ -308,23 +194,12 @@ class MongoDbSessionHandlerTest extends TestCase
         $method = new \ReflectionMethod($this->storage, 'getMongo');
         $method->setAccessible(true);
 
-        if (phpversion('mongodb')) {
-            $mongoClass = 'MongoDB\Client';
-        } else {
-            $mongoClass = version_compare(phpversion('mongo'), '1.3.0', '<') ? 'Mongo' : 'MongoClient';
-        }
-
-        $this->assertInstanceOf($mongoClass, $method->invoke($this->storage));
+        $this->assertInstanceOf(\MongoDB\Client::class, $method->invoke($this->storage));
     }
 
     private function createMongoCollectionMock()
     {
-        $collectionClass = 'MongoCollection';
-        if (phpversion('mongodb')) {
-            $collectionClass = 'MongoDB\Collection';
-        }
-
-        $collection = $this->getMockBuilder($collectionClass)
+        $collection = $this->getMockBuilder(\MongoDB\Collection::class)
             ->disableOriginalConstructor()
             ->getMock();
 
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php
index dc827d8..368af6a 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php
@@ -27,9 +27,8 @@ class NativeFileSessionHandlerTest extends TestCase
 {
     public function testConstruct()
     {
-        $storage = new NativeSessionStorage(['name' => 'TESTING'], new NativeFileSessionHandler(sys_get_temp_dir()));
+        new NativeSessionStorage(['name' => 'TESTING'], new NativeFileSessionHandler(sys_get_temp_dir()));
 
-        $this->assertEquals('files', $storage->getSaveHandler()->getSaveHandlerName());
         $this->assertEquals('user', ini_get('session.save_handler'));
 
         $this->assertEquals(sys_get_temp_dir(), ini_get('session.save_path'));
@@ -41,9 +40,9 @@ class NativeFileSessionHandlerTest extends TestCase
      */
     public function testConstructSavePath($savePath, $expectedSavePath, $path)
     {
-        $handler = new NativeFileSessionHandler($savePath);
+        new NativeFileSessionHandler($savePath);
         $this->assertEquals($expectedSavePath, ini_get('session.save_path'));
-        $this->assertTrue(is_dir(realpath($path)));
+        $this->assertDirectoryExists(realpath($path));
 
         rmdir($path);
     }
@@ -59,18 +58,16 @@ class NativeFileSessionHandlerTest extends TestCase
         ];
     }
 
-    /**
-     * @expectedException \InvalidArgumentException
-     */
     public function testConstructException()
     {
-        $handler = new NativeFileSessionHandler('something;invalid;with;too-many-args');
+        $this->expectException('InvalidArgumentException');
+        new NativeFileSessionHandler('something;invalid;with;too-many-args');
     }
 
     public function testConstructDefault()
     {
         $path = ini_get('session.save_path');
-        $storage = new NativeSessionStorage(['name' => 'TESTING'], new NativeFileSessionHandler());
+        new NativeSessionStorage(['name' => 'TESTING'], new NativeFileSessionHandler());
 
         $this->assertEquals($path, ini_get('session.save_path'));
     }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php
deleted file mode 100644
index 4a9fb60..0000000
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler;
-
-use PHPUnit\Framework\TestCase;
-use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler;
-
-/**
- * Test class for NativeSessionHandler.
- *
- * @author Drak <drak@zikula.org>
- *
- * @runTestsInSeparateProcesses
- * @preserveGlobalState disabled
- * @group legacy
- */
-class NativeSessionHandlerTest extends TestCase
-{
-    /**
-     * @expectedDeprecation The Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler class is deprecated since Symfony 3.4 and will be removed in 4.0. Use the \SessionHandler class instead.
-     */
-    public function testConstruct()
-    {
-        $handler = new NativeSessionHandler();
-
-        $this->assertInstanceOf('SessionHandler', $handler);
-        $this->assertTrue($handler instanceof NativeSessionHandler);
-    }
-}
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php
index 0d246e1..f793db1 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php
@@ -28,7 +28,7 @@ class NullSessionHandlerTest extends TestCase
 {
     public function testSaveHandlers()
     {
-        $storage = $this->getStorage();
+        $this->getStorage();
         $this->assertEquals('user', ini_get('session.save_handler'));
     }
 
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php
index f0914eb..5aee54b 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php
@@ -22,7 +22,7 @@ class PdoSessionHandlerTest extends TestCase
 {
     private $dbFile;
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         // make sure the temporary database file is deleted when it has been created (even when a test fails)
         if ($this->dbFile) {
@@ -33,7 +33,7 @@ class PdoSessionHandlerTest extends TestCase
 
     protected function getPersistentSqliteDsn()
     {
-        $this->dbFile = tempnam(sys_get_temp_dir(), 'sf2_sqlite_sessions');
+        $this->dbFile = tempnam(sys_get_temp_dir(), 'sf_sqlite_sessions');
 
         return 'sqlite:'.$this->dbFile;
     }
@@ -48,22 +48,18 @@ class PdoSessionHandlerTest extends TestCase
         return $pdo;
     }
 
-    /**
-     * @expectedException \InvalidArgumentException
-     */
     public function testWrongPdoErrMode()
     {
+        $this->expectException('InvalidArgumentException');
         $pdo = $this->getMemorySqlitePdo();
         $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_SILENT);
 
-        $storage = new PdoSessionHandler($pdo);
+        new PdoSessionHandler($pdo);
     }
 
-    /**
-     * @expectedException \RuntimeException
-     */
     public function testInexistentTable()
     {
+        $this->expectException('RuntimeException');
         $storage = new PdoSessionHandler($this->getMemorySqlitePdo(), ['db_table' => 'inexistent_table']);
         $storage->open('', 'sid');
         $storage->read('id');
@@ -71,11 +67,9 @@ class PdoSessionHandlerTest extends TestCase
         $storage->close();
     }
 
-    /**
-     * @expectedException \RuntimeException
-     */
     public function testCreateTableTwice()
     {
+        $this->expectException('RuntimeException');
         $storage = new PdoSessionHandler($this->getMemorySqlitePdo());
         $storage->createTable();
     }
@@ -136,10 +130,6 @@ class PdoSessionHandlerTest extends TestCase
 
     public function testReadConvertsStreamToString()
     {
-        if (\defined('HHVM_VERSION')) {
-            $this->markTestSkipped('PHPUnit_MockObject cannot mock the PDOStatement class on HHVM. See https://github.com/sebastianbergmann/phpunit-mock-objects/pull/289');
-        }
-
         $pdo = new MockPdo('pgsql');
         $pdo->prepareResult = $this->getMockBuilder('PDOStatement')->getMock();
 
@@ -157,9 +147,6 @@ class PdoSessionHandlerTest extends TestCase
 
     public function testReadLockedConvertsStreamToString()
     {
-        if (\defined('HHVM_VERSION')) {
-            $this->markTestSkipped('PHPUnit_MockObject cannot mock the PDOStatement class on HHVM. See https://github.com/sebastianbergmann/phpunit-mock-objects/pull/289');
-        }
         if (filter_var(ini_get('session.use_strict_mode'), FILTER_VALIDATE_BOOLEAN)) {
             $this->markTestSkipped('Strict mode needs no locking for new sessions.');
         }
@@ -330,15 +317,15 @@ class PdoSessionHandlerTest extends TestCase
     public function testUrlDsn($url, $expectedDsn, $expectedUser = null, $expectedPassword = null)
     {
         $storage = new PdoSessionHandler($url);
-
-        $this->assertAttributeEquals($expectedDsn, 'dsn', $storage);
-
-        if (null !== $expectedUser) {
-            $this->assertAttributeEquals($expectedUser, 'username', $storage);
-        }
-
-        if (null !== $expectedPassword) {
-            $this->assertAttributeEquals($expectedPassword, 'password', $storage);
+        $reflection = new \ReflectionClass(PdoSessionHandler::class);
+
+        foreach (['dsn' => $expectedDsn, 'username' => $expectedUser, 'password' => $expectedPassword] as $property => $expectedValue) {
+            if (!isset($expectedValue)) {
+                continue;
+            }
+            $property = $reflection->getProperty($property);
+            $property->setAccessible(true);
+            $this->assertSame($expectedValue, $property->getValue($storage));
         }
     }
 
@@ -397,7 +384,7 @@ class MockPdo extends \PDO
     public function prepare($statement, $driverOptions = [])
     {
         return \is_callable($this->prepareResult)
-            ? \call_user_func($this->prepareResult, $statement, $driverOptions)
+            ? ($this->prepareResult)($statement, $driverOptions)
             : $this->prepareResult;
     }
 
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php
deleted file mode 100644
index b89454f..0000000
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler;
-
-use PHPUnit\Framework\TestCase;
-use Symfony\Component\HttpFoundation\Session\Storage\Handler\WriteCheckSessionHandler;
-
-/**
- * @author Adrien Brault <adrien.brault@gmail.com>
- *
- * @group legacy
- */
-class WriteCheckSessionHandlerTest extends TestCase
-{
-    public function test()
-    {
-        $wrappedSessionHandlerMock = $this->getMockBuilder('SessionHandlerInterface')->getMock();
-        $writeCheckSessionHandler = new WriteCheckSessionHandler($wrappedSessionHandlerMock);
-
-        $wrappedSessionHandlerMock
-            ->expects($this->once())
-            ->method('close')
-            ->with()
-            ->willReturn(true)
-        ;
-
-        $this->assertTrue($writeCheckSessionHandler->close());
-    }
-
-    public function testWrite()
-    {
-        $wrappedSessionHandlerMock = $this->getMockBuilder('SessionHandlerInterface')->getMock();
-        $writeCheckSessionHandler = new WriteCheckSessionHandler($wrappedSessionHandlerMock);
-
-        $wrappedSessionHandlerMock
-            ->expects($this->once())
-            ->method('write')
-            ->with('foo', 'bar')
-            ->willReturn(true)
-        ;
-
-        $this->assertTrue($writeCheckSessionHandler->write('foo', 'bar'));
-    }
-
-    public function testSkippedWrite()
-    {
-        $wrappedSessionHandlerMock = $this->getMockBuilder('SessionHandlerInterface')->getMock();
-        $writeCheckSessionHandler = new WriteCheckSessionHandler($wrappedSessionHandlerMock);
-
-        $wrappedSessionHandlerMock
-            ->expects($this->once())
-            ->method('read')
-            ->with('foo')
-            ->willReturn('bar')
-        ;
-
-        $wrappedSessionHandlerMock
-            ->expects($this->never())
-            ->method('write')
-        ;
-
-        $this->assertEquals('bar', $writeCheckSessionHandler->read('foo'));
-        $this->assertTrue($writeCheckSessionHandler->write('foo', 'bar'));
-    }
-
-    public function testNonSkippedWrite()
-    {
-        $wrappedSessionHandlerMock = $this->getMockBuilder('SessionHandlerInterface')->getMock();
-        $writeCheckSessionHandler = new WriteCheckSessionHandler($wrappedSessionHandlerMock);
-
-        $wrappedSessionHandlerMock
-            ->expects($this->once())
-            ->method('read')
-            ->with('foo')
-            ->willReturn('bar')
-        ;
-
-        $wrappedSessionHandlerMock
-            ->expects($this->once())
-            ->method('write')
-            ->with('foo', 'baZZZ')
-            ->willReturn(true)
-        ;
-
-        $this->assertEquals('bar', $writeCheckSessionHandler->read('foo'));
-        $this->assertTrue($writeCheckSessionHandler->write('foo', 'baZZZ'));
-    }
-}
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/MetadataBagTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/MetadataBagTest.php
index 2c4758b..e040f48 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/MetadataBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/MetadataBagTest.php
@@ -28,7 +28,7 @@ class MetadataBagTest extends TestCase
 
     protected $array = [];
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->bag = new MetadataBag();
@@ -36,7 +36,7 @@ class MetadataBagTest extends TestCase
         $this->bag->initialize($this->array);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         $this->array = [];
         $this->bag = null;
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/MockArraySessionStorageTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/MockArraySessionStorageTest.php
index 2e3024e..b99e719 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/MockArraySessionStorageTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/MockArraySessionStorageTest.php
@@ -40,7 +40,7 @@ class MockArraySessionStorageTest extends TestCase
 
     private $data;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->attributes = new AttributeBag();
         $this->flashes = new FlashBag();
@@ -56,7 +56,7 @@ class MockArraySessionStorageTest extends TestCase
         $this->storage->setSessionData($this->data);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         $this->data = null;
         $this->flashes = null;
@@ -121,11 +121,9 @@ class MockArraySessionStorageTest extends TestCase
         $this->assertTrue($storage->isStarted());
     }
 
-    /**
-     * @expectedException \RuntimeException
-     */
     public function testUnstartedSave()
     {
+        $this->expectException('RuntimeException');
         $this->storage->save();
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php
index 9e2692d..8e2051f 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php
@@ -33,20 +33,20 @@ class MockFileSessionStorageTest extends TestCase
      */
     protected $storage;
 
-    protected function setUp()
+    protected function setUp(): void
     {
-        $this->sessionDir = sys_get_temp_dir().'/sf2test';
+        $this->sessionDir = sys_get_temp_dir().'/sftest';
         $this->storage = $this->getStorage();
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
-        $this->sessionDir = null;
-        $this->storage = null;
-        array_map('unlink', glob($this->sessionDir.'/*.session'));
+        array_map('unlink', glob($this->sessionDir.'/*'));
         if (is_dir($this->sessionDir)) {
             rmdir($this->sessionDir);
         }
+        $this->sessionDir = null;
+        $this->storage = null;
     }
 
     public function testStart()
@@ -107,11 +107,9 @@ class MockFileSessionStorageTest extends TestCase
         $this->assertEquals('bar', $storage2->getBag('attributes')->get('foo'), 'values persist between instances');
     }
 
-    /**
-     * @expectedException \RuntimeException
-     */
     public function testSaveWithoutStart()
     {
+        $this->expectException('RuntimeException');
         $storage1 = $this->getStorage();
         $storage1->save();
     }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php
index 7cc2eb7..4efc8d2 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php
@@ -33,16 +33,16 @@ class NativeSessionStorageTest extends TestCase
 {
     private $savePath;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->iniSet('session.save_handler', 'files');
-        $this->iniSet('session.save_path', $this->savePath = sys_get_temp_dir().'/sf2test');
+        $this->iniSet('session.save_path', $this->savePath = sys_get_temp_dir().'/sftest');
         if (!is_dir($this->savePath)) {
             mkdir($this->savePath);
         }
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         session_write_close();
         array_map('unlink', glob($this->savePath.'/*'));
@@ -72,20 +72,16 @@ class NativeSessionStorageTest extends TestCase
         $this->assertSame($bag, $storage->getBag($bag->getName()));
     }
 
-    /**
-     * @expectedException \InvalidArgumentException
-     */
     public function testRegisterBagException()
     {
+        $this->expectException('InvalidArgumentException');
         $storage = $this->getStorage();
         $storage->getBag('non_existing');
     }
 
-    /**
-     * @expectedException \LogicException
-     */
     public function testRegisterBagForAStartedSessionThrowsException()
     {
+        $this->expectException('LogicException');
         $storage = $this->getStorage();
         $storage->start();
         $storage->registerBag(new AttributeBag());
@@ -98,7 +94,7 @@ class NativeSessionStorageTest extends TestCase
 
         $storage->start();
         $id = $storage->getId();
-        $this->assertInternalType('string', $id);
+        $this->assertIsString($id);
         $this->assertNotSame('', $id);
 
         $storage->save();
@@ -149,7 +145,7 @@ class NativeSessionStorageTest extends TestCase
     {
         $this->iniSet('session.cache_limiter', 'nocache');
 
-        $storage = new NativeSessionStorage();
+        new NativeSessionStorage();
         $this->assertEquals('', ini_get('session.cache_limiter'));
     }
 
@@ -157,7 +153,7 @@ class NativeSessionStorageTest extends TestCase
     {
         $this->iniSet('session.cache_limiter', 'nocache');
 
-        $storage = new NativeSessionStorage(['cache_limiter' => 'public']);
+        new NativeSessionStorage(['cache_limiter' => 'public']);
         $this->assertEquals('public', ini_get('session.cache_limiter'));
     }
 
@@ -171,6 +167,10 @@ class NativeSessionStorageTest extends TestCase
             'cookie_httponly' => false,
         ];
 
+        if (\PHP_VERSION_ID >= 70300) {
+            $options['cookie_samesite'] = 'lax';
+        }
+
         $this->getStorage($options);
         $temp = session_get_cookie_params();
         $gco = [];
@@ -179,8 +179,6 @@ class NativeSessionStorageTest extends TestCase
             $gco['cookie_'.$key] = $value;
         }
 
-        unset($gco['cookie_samesite']);
-
         $this->assertEquals($options, $gco);
     }
 
@@ -201,11 +199,9 @@ class NativeSessionStorageTest extends TestCase
         $this->assertSame('200', ini_get('session.cache_expire'));
     }
 
-    /**
-     * @expectedException \InvalidArgumentException
-     */
     public function testSetSaveHandlerException()
     {
+        $this->expectException('InvalidArgumentException');
         $storage = $this->getStorage();
         $storage->setSaveHandler(new \stdClass());
     }
@@ -228,11 +224,9 @@ class NativeSessionStorageTest extends TestCase
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
     }
 
-    /**
-     * @expectedException \RuntimeException
-     */
     public function testStarted()
     {
+        $this->expectException('RuntimeException');
         $storage = $this->getStorage();
 
         $this->assertFalse($storage->getSaveHandler()->isActive());
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php
index 752be61..7d68270 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php
@@ -29,16 +29,16 @@ class PhpBridgeSessionStorageTest extends TestCase
 {
     private $savePath;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->iniSet('session.save_handler', 'files');
-        $this->iniSet('session.save_path', $this->savePath = sys_get_temp_dir().'/sf2test');
+        $this->iniSet('session.save_path', $this->savePath = sys_get_temp_dir().'/sftest');
         if (!is_dir($this->savePath)) {
             mkdir($this->savePath);
         }
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         session_write_close();
         array_map('unlink', glob($this->savePath.'/*'));
@@ -64,13 +64,12 @@ class PhpBridgeSessionStorageTest extends TestCase
     {
         $storage = $this->getStorage();
 
-        $this->assertFalse($storage->getSaveHandler()->isActive());
+        $this->assertNotSame(\PHP_SESSION_ACTIVE, session_status());
         $this->assertFalse($storage->isStarted());
 
         session_start();
         $this->assertTrue(isset($_SESSION));
-        // in PHP 5.4 we can reliably detect a session started
-        $this->assertTrue($storage->getSaveHandler()->isActive());
+        $this->assertSame(\PHP_SESSION_ACTIVE, session_status());
         // PHP session might have started, but the storage driver has not, so false is correct here
         $this->assertFalse($storage->isStarted());
 
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php
index cbb291f..4820a65 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php
@@ -27,12 +27,12 @@ class AbstractProxyTest extends TestCase
      */
     protected $proxy;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->proxy = $this->getMockForAbstractClass(AbstractProxy::class);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         $this->proxy = null;
     }
@@ -80,10 +80,10 @@ class AbstractProxyTest extends TestCase
     /**
      * @runInSeparateProcess
      * @preserveGlobalState disabled
-     * @expectedException \LogicException
      */
     public function testNameException()
     {
+        $this->expectException('LogicException');
         session_start();
         $this->proxy->setName('foo');
     }
@@ -103,10 +103,10 @@ class AbstractProxyTest extends TestCase
     /**
      * @runInSeparateProcess
      * @preserveGlobalState disabled
-     * @expectedException \LogicException
      */
     public function testIdException()
     {
+        $this->expectException('LogicException');
         session_start();
         $this->proxy->setId('foo');
     }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/NativeProxyTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/NativeProxyTest.php
deleted file mode 100644
index ed4fee6..0000000
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/NativeProxyTest.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Proxy;
-
-use PHPUnit\Framework\TestCase;
-use Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy;
-
-/**
- * Test class for NativeProxy.
- *
- * @group legacy
- *
- * @author Drak <drak@zikula.org>
- */
-class NativeProxyTest extends TestCase
-{
-    public function testIsWrapper()
-    {
-        $proxy = new NativeProxy();
-        $this->assertFalse($proxy->isWrapper());
-    }
-
-    public function testGetSaveHandlerName()
-    {
-        $name = ini_get('session.save_handler');
-        $proxy = new NativeProxy();
-        $this->assertEquals($name, $proxy->getSaveHandlerName());
-    }
-}
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php
index b6e0da9..1cf4aed 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php
@@ -25,7 +25,7 @@ use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;
 class SessionHandlerProxyTest extends TestCase
 {
     /**
-     * @var \PHPUnit_Framework_MockObject_Matcher
+     * @var \PHPUnit\Framework\MockObject\Matcher
      */
     private $mock;
 
@@ -34,13 +34,13 @@ class SessionHandlerProxyTest extends TestCase
      */
     private $proxy;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->mock = $this->getMockBuilder('SessionHandlerInterface')->getMock();
         $this->proxy = new SessionHandlerProxy($this->mock);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         $this->mock = null;
         $this->proxy = null;
@@ -144,7 +144,8 @@ class SessionHandlerProxyTest extends TestCase
     {
         $mock = $this->getMockBuilder(['SessionHandlerInterface', 'SessionUpdateTimestampHandlerInterface'])->getMock();
         $mock->expects($this->once())
-            ->method('updateTimestamp');
+            ->method('updateTimestamp')
+            ->willReturn(false);
 
         $proxy = new SessionHandlerProxy($mock);
         $proxy->updateTimestamp('id', 'data');
diff --git a/vendor/symfony/http-foundation/Tests/StreamedResponseTest.php b/vendor/symfony/http-foundation/Tests/StreamedResponseTest.php
index 62dfc9b..a084e91 100644
--- a/vendor/symfony/http-foundation/Tests/StreamedResponseTest.php
+++ b/vendor/symfony/http-foundation/Tests/StreamedResponseTest.php
@@ -81,20 +81,16 @@ class StreamedResponseTest extends TestCase
         $this->assertEquals(1, $called);
     }
 
-    /**
-     * @expectedException \LogicException
-     */
     public function testSendContentWithNonCallable()
     {
+        $this->expectException('LogicException');
         $response = new StreamedResponse(null);
         $response->sendContent();
     }
 
-    /**
-     * @expectedException \LogicException
-     */
     public function testSetContent()
     {
+        $this->expectException('LogicException');
         $response = new StreamedResponse(function () { echo 'foo'; });
         $response->setContent('foo');
     }
diff --git a/vendor/symfony/http-foundation/composer.json b/vendor/symfony/http-foundation/composer.json
index f6c6f2e..f309751 100644
--- a/vendor/symfony/http-foundation/composer.json
+++ b/vendor/symfony/http-foundation/composer.json
@@ -16,12 +16,13 @@
         }
     ],
     "require": {
-        "php": "^5.5.9|>=7.0.8",
-        "symfony/polyfill-mbstring": "~1.1",
-        "symfony/polyfill-php70": "~1.6"
+        "php": "^7.1.3",
+        "symfony/mime": "^4.3",
+        "symfony/polyfill-mbstring": "~1.1"
     },
     "require-dev": {
-        "symfony/expression-language": "~2.8|~3.0|~4.0"
+        "predis/predis": "~1.0",
+        "symfony/expression-language": "~3.4|~4.0"
     },
     "autoload": {
         "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" },
@@ -32,7 +33,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-master": "3.4-dev"
+            "dev-master": "4.3-dev"
         }
     }
 }
diff --git a/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php
index a5e4a8f..1fc4fee 100644
--- a/vendor/symfony/polyfill-mbstring/Mbstring.php
+++ b/vendor/symfony/polyfill-mbstring/Mbstring.php
@@ -35,6 +35,7 @@ namespace Symfony\Polyfill\Mbstring;
  * - mb_strlen               - Get string length
  * - mb_strpos               - Find position of first occurrence of string in a string
  * - mb_strrpos              - Find position of last occurrence of a string in a string
+ * - mb_str_split            - Convert a string to an array
  * - mb_strtolower           - Make a string lowercase
  * - mb_strtoupper           - Make a string uppercase
  * - mb_substitute_character - Set/Get substitution character
@@ -523,6 +524,34 @@ final class Mbstring
         return false !== $pos ? $offset + $pos : false;
     }
 
+    public static function mb_str_split($string, $split_length = 1, $encoding = null)
+    {
+        if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) {
+            trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', E_USER_WARNING);
+
+            return null;
+        }
+
+        if ($split_length < 1) {
+            trigger_error('The length of each segment must be greater than zero', E_USER_WARNING);
+
+            return false;
+        }
+
+        if (null === $encoding) {
+            $encoding = mb_internal_encoding();
+        }
+
+        $result = array();
+        $length = mb_strlen($string, $encoding);
+
+        for ($i = 0; $i < $length; $i += $split_length) {
+            $result[] = mb_substr($string, $i, $split_length, $encoding);
+        }
+
+        return $result;
+    }
+
     public static function mb_strtolower($s, $encoding = null)
     {
         return self::mb_convert_case($s, MB_CASE_LOWER, $encoding);
@@ -546,7 +575,7 @@ final class Mbstring
     {
         $encoding = self::getEncoding($encoding);
         if ('CP850' === $encoding || 'ASCII' === $encoding) {
-            return substr($s, $start, null === $length ? 2147483647 : $length);
+            return (string) substr($s, $start, null === $length ? 2147483647 : $length);
         }
 
         if ($start < 0) {
diff --git a/vendor/symfony/polyfill-mbstring/bootstrap.php b/vendor/symfony/polyfill-mbstring/bootstrap.php
index 2fdcc5a..204a41b 100644
--- a/vendor/symfony/polyfill-mbstring/bootstrap.php
+++ b/vendor/symfony/polyfill-mbstring/bootstrap.php
@@ -56,3 +56,7 @@ if (!function_exists('mb_chr')) {
     function mb_chr($code, $enc = null) { return p\Mbstring::mb_chr($code, $enc); }
     function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); }
 }
+
+if (!function_exists('mb_str_split')) {
+    function mb_str_split($string, $split_length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $split_length, $encoding); }
+}
diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json
index 0bce087..308f009 100644
--- a/vendor/symfony/polyfill-mbstring/composer.json
+++ b/vendor/symfony/polyfill-mbstring/composer.json
@@ -28,7 +28,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-master": "1.11-dev"
+            "dev-master": "1.12-dev"
         }
     }
 }
diff --git a/vendor/symfony/polyfill-php70/LICENSE b/vendor/symfony/polyfill-php70/LICENSE
deleted file mode 100644
index 4cd8bdd..0000000
--- a/vendor/symfony/polyfill-php70/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2015-2019 Fabien Potencier
-
-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.
diff --git a/vendor/symfony/polyfill-php70/Php70.php b/vendor/symfony/polyfill-php70/Php70.php
deleted file mode 100644
index 7f1ad08..0000000
--- a/vendor/symfony/polyfill-php70/Php70.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Polyfill\Php70;
-
-/**
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @internal
- */
-final class Php70
-{
-    public static function intdiv($dividend, $divisor)
-    {
-        $dividend = self::intArg($dividend, __FUNCTION__, 1);
-        $divisor = self::intArg($divisor, __FUNCTION__, 2);
-
-        if (0 === $divisor) {
-            throw new \DivisionByZeroError('Division by zero');
-        }
-        if (-1 === $divisor && ~PHP_INT_MAX === $dividend) {
-            throw new \ArithmeticError('Division of PHP_INT_MIN by -1 is not an integer');
-        }
-
-        return ($dividend - ($dividend % $divisor)) / $divisor;
-    }
-
-    public static function preg_replace_callback_array(array $patterns, $subject, $limit = -1, &$count = 0)
-    {
-        $count = 0;
-        $result = (string) $subject;
-        if (0 === $limit = self::intArg($limit, __FUNCTION__, 3)) {
-            return $result;
-        }
-
-        foreach ($patterns as $pattern => $callback) {
-            $result = preg_replace_callback($pattern, $callback, $result, $limit, $c);
-            $count += $c;
-        }
-
-        return $result;
-    }
-
-    public static function error_clear_last()
-    {
-        static $handler;
-        if (!$handler) {
-            $handler = function () { return false; };
-        }
-        set_error_handler($handler);
-        @trigger_error('');
-        restore_error_handler();
-    }
-
-    private static function intArg($value, $caller, $pos)
-    {
-        if (\is_int($value)) {
-            return $value;
-        }
-        if (!\is_numeric($value) || PHP_INT_MAX <= ($value += 0) || ~PHP_INT_MAX >= $value) {
-            throw new \TypeError(sprintf('%s() expects parameter %d to be integer, %s given', $caller, $pos, \gettype($value)));
-        }
-
-        return (int) $value;
-    }
-}
diff --git a/vendor/symfony/polyfill-php70/README.md b/vendor/symfony/polyfill-php70/README.md
deleted file mode 100644
index 04988c6..0000000
--- a/vendor/symfony/polyfill-php70/README.md
+++ /dev/null
@@ -1,28 +0,0 @@
-Symfony Polyfill / Php70
-========================
-
-This component provides features unavailable in releases prior to PHP 7.0:
-
-- [`intdiv`](http://php.net/intdiv)
-- [`preg_replace_callback_array`](http://php.net/preg_replace_callback_array)
-- [`error_clear_last`](http://php.net/error_clear_last)
-- `random_bytes` and `random_int` (from [paragonie/random_compat](https://github.com/paragonie/random_compat))
-- [`*Error` throwable classes](http://php.net/Error)
-- [`PHP_INT_MIN`](http://php.net/manual/en/reserved.constants.php#constant.php-int-min)
-- `SessionUpdateTimestampHandlerInterface`
-
-More information can be found in the
-[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
-
-Compatibility notes
-===================
-
-To write portable code between PHP5 and PHP7, some care must be taken:
-- `\*Error` exceptions must be caught before `\Exception`;
-- after calling `error_clear_last()`, the result of `$e = error_get_last()` must be
-  verified using `isset($e['message'][0])` instead of `null !== $e`.
-
-License
-=======
-
-This library is released under the [MIT license](LICENSE).
diff --git a/vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php b/vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php
deleted file mode 100644
index 6819124..0000000
--- a/vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-
-class ArithmeticError extends Error
-{
-}
diff --git a/vendor/symfony/polyfill-php70/Resources/stubs/AssertionError.php b/vendor/symfony/polyfill-php70/Resources/stubs/AssertionError.php
deleted file mode 100644
index acb1250..0000000
--- a/vendor/symfony/polyfill-php70/Resources/stubs/AssertionError.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-
-class AssertionError extends Error
-{
-}
diff --git a/vendor/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php b/vendor/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php
deleted file mode 100644
index c99278b..0000000
--- a/vendor/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-
-class DivisionByZeroError extends Error
-{
-}
diff --git a/vendor/symfony/polyfill-php70/Resources/stubs/Error.php b/vendor/symfony/polyfill-php70/Resources/stubs/Error.php
deleted file mode 100644
index 405847f..0000000
--- a/vendor/symfony/polyfill-php70/Resources/stubs/Error.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-
-class Error extends Exception
-{
-}
diff --git a/vendor/symfony/polyfill-php70/Resources/stubs/ParseError.php b/vendor/symfony/polyfill-php70/Resources/stubs/ParseError.php
deleted file mode 100644
index 2dd447d..0000000
--- a/vendor/symfony/polyfill-php70/Resources/stubs/ParseError.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-
-class ParseError extends Error
-{
-}
diff --git a/vendor/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php b/vendor/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php
deleted file mode 100644
index 0cc02c8..0000000
--- a/vendor/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-interface SessionUpdateTimestampHandlerInterface
-{
-    /**
-     * Checks if a session identifier already exists or not.
-     *
-     * @param string $key
-     *
-     * @return bool
-     */
-    public function validateId($key);
-
-    /**
-     * Updates the timestamp of a session when its data didn't change.
-     *
-     * @param string $key
-     * @param string $val
-     *
-     * @return bool
-     */
-    public function updateTimestamp($key, $val);
-}
diff --git a/vendor/symfony/polyfill-php70/Resources/stubs/TypeError.php b/vendor/symfony/polyfill-php70/Resources/stubs/TypeError.php
deleted file mode 100644
index 2bed1b4..0000000
--- a/vendor/symfony/polyfill-php70/Resources/stubs/TypeError.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-
-class TypeError extends Error
-{
-}
diff --git a/vendor/symfony/polyfill-php70/bootstrap.php b/vendor/symfony/polyfill-php70/bootstrap.php
deleted file mode 100644
index 445c398..0000000
--- a/vendor/symfony/polyfill-php70/bootstrap.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-use Symfony\Polyfill\Php70 as p;
-
-if (PHP_VERSION_ID < 70000) {
-    if (!defined('PHP_INT_MIN')) {
-        define('PHP_INT_MIN', ~PHP_INT_MAX);
-    }
-    if (!function_exists('intdiv')) {
-        function intdiv($dividend, $divisor) { return p\Php70::intdiv($dividend, $divisor); }
-    }
-    if (!function_exists('preg_replace_callback_array')) {
-        function preg_replace_callback_array(array $patterns, $subject, $limit = -1, &$count = 0) { return p\Php70::preg_replace_callback_array($patterns, $subject, $limit, $count); }
-    }
-    if (!function_exists('error_clear_last')) {
-        function error_clear_last() { return p\Php70::error_clear_last(); }
-    }
-}
diff --git a/vendor/symfony/polyfill-php70/composer.json b/vendor/symfony/polyfill-php70/composer.json
deleted file mode 100644
index 923f309..0000000
--- a/vendor/symfony/polyfill-php70/composer.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-    "name": "symfony/polyfill-php70",
-    "type": "library",
-    "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
-    "keywords": ["polyfill", "shim", "compatibility", "portable"],
-    "homepage": "https://symfony.com",
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "Nicolas Grekas",
-            "email": "p@tchwork.com"
-        },
-        {
-            "name": "Symfony Community",
-            "homepage": "https://symfony.com/contributors"
-        }
-    ],
-    "require": {
-        "php": ">=5.3.3",
-        "paragonie/random_compat": "~1.0|~2.0|~9.99"
-    },
-    "autoload": {
-        "psr-4": { "Symfony\\Polyfill\\Php70\\": "" },
-        "files": [ "bootstrap.php" ],
-        "classmap": [ "Resources/stubs" ]
-    },
-    "minimum-stability": "dev",
-    "extra": {
-        "branch-alias": {
-            "dev-master": "1.11-dev"
-        }
-    }
-}